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比较灵活