switch语法中对于有序数简单解读(C语言)
hi,各位:
今天学到了switch这一部分,对于switch/case这部分,在我短暂的代码生涯中出现的机会并不多,一开始我以为这个函数实现就和if/else if/else一样,是通过对数值的多次判断来实现的。然而今天学完之后发现该语法内有乾坤。
首先我们回顾一下switch的语法
在****中是这样描述的:
switch ( expression )
case constant-expression : statement
[default : statement]
而其中,switch的参数expression在C中明确规定为必须属于整型或存在到整型的明确转换的类类型。
及该参数在switch中,会按照整形的标准进行存储,及如果你的参数是声明为char类型的字符’b’则会被转换为ascii码0x62的形式进行运算。
switch后,需要多个case + 常数表达式来对上文说到的参数进行判断。
以上为switch的基本使用方式。
而实际在使用中,为什么某些场景会使用switch,而不是if语句呢?
那是因为switch在执行的时候会对程序中case后的多个常数表达式进行优化,从而建立一个常数与执行代码指针的对应关系。而该优化可以使得switch在执行的时候运算效率高于if语句
以下方代码为例子:
switch(a){
case 0x10 :{
printf("%d",a);
break;
}
case 0x11:{
printf("%d",a);
break;
}
case 0x12:{
printf("%d",a);
break;
}
case 0x13:{
printf("%d",a);
break;
}
case 0x14:{
printf("%d",a);
break;
}
case 0x15:{
printf("%d",a);
break;
}
}
该代码case后跟的常数表达式为0x10,0x11,0x12,0x13,0x14,0x15。及以0x10为起点,设其为0值,界限值为5。清楚了起点和界限值后,便可以建立其常数与代码指针的映射关系。如下表,下面内存图每个常数对应代码指针我都用不同的颜色进行了表示。
常数 | 代码指针 |
---|---|
0(红色部分) | 0x98507C+0x4*0 |
1 | 0x98507C+0x4*1 |
2 | 0x98507C+0x4*2 |
3 | 0x98507C+0x4*3 |
4 | 0x98507C+0x4*4 |
5 | 0x98507C+0x4*5 |
而优化后switch执行汇编我也以图片形式标识出来。
内存图中,下方四个字节四个字节存储的便是代码指针,因为x86为小尾方式存储,所以以红色部分为例子,其代码指针为0x00984FB5,及红色标识长的部分。
写到后面有点乱,先发布后面慢慢改吧,主要是switch的优化算法部分并不明晰。
若要转载麻烦注明出处。