Mohican_4/1 C语言 switch 跳转表 直通性 与if else 比较

switch

switch语句可以根据一个整数索引值进行多重分支。处理具有多种可能结果的测试时,这种语句特别有用。

1.switch跳转表

  跳转表是一个数组,表项i是一个代码段的地址,这个代码段实现当switch索引值等于i时程序应该执行的动作。

  程序代码用于索引值来执行一个跳转表内的数组引用,确定跳转指令的目标。

  和使用一组很长的if-else相比,使用跳转表的优点是执行switch语句的时间与switch的case数量无关。

int func(int x)
{
  int ret = -1;
  switch(x)
    {
    case 1: ret = 2; break;
    case 2: ret = 1; break;
    case 4:
    case 5: ret = 6; break;
    case 6: ret = 3; break;
    default: ret = 0; break;
    }
  return ret;
}


C语言把跳转表声明为一个多元素的数组,

第n个元素都是一个指向代码的指针。

跳转表对于重复情况处理就是简单地对重复项填入相同的标号(case 4、5),

而对于缺失情况填入default的标号(switch内容为3时)。

http://blog.163.com/strive_only/blog/static/89380168201110394925474/


2.switch不加break为什么具有直通性

因为跳转是在进入   switch   是计算出的,而不是在case语句中计算出的,整个   
 case   语句群就是一块完整而连续的代码,只是switch让其从不同的位置开始执行。   

http://blog.chinaunix.net/uid/20434957.html


3.switch和if else 那个效率高

具体如下:

switch有点以空间换时间的意思.

a.     当分支较多时,当时用switch的效率是很高的。因为switch是随机访问的,就是确定了选择值之后直接跳转到那个特定的分支,但是if。。else是遍历所以得可能值,知道找到符合条件的分支。如此看来,switch的效率确实比ifelse要高的多。

b.   switch...case占用较多的代码空间,因为它要生成跳表,特别是当case常量分布范围很大但实际有效值又比较少的情况,switch...case的空间利用率将变得很低。

c.     switch...case只能处理case为常量的情况,对非常量的情况是无能为力的。例如 if (a > 1 && a < 100),是无法使用switch...case来处理的。所以,switch只能是在常量选择分支时比ifelse效率高,但是ifelse能应用于更多的场合,ifelse比较灵活




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值