目录
if else
switch case
总结
今天我们学习的是 if else 和 switch case 的区别,以及了解它们各自的优势。
if else 和 switch case 都是作为条件判断语句来使用的。但是它们又有各自的使用场景。接下来将展示各自的汇编代码来进行对比。
if else
if 语句通过对表达式值的真假来判断执行路径。比如如果计算出来的值符合条件就执行语句1,不符合就执行语句2。
在下图中,左边为C代码,右边是对应的汇编。
这里通过汇编代码可以大概理解,示例中 if 判断其实就是遍历每个判断节点,这是很耗时间的。
总结来讲,if有以下特点:
if语句判断类型是真或假,switch是整型值或者字符、字符串;
if使用场景为判断真假值,用于关系表达式和逻辑表达式,还有判断浮点数;
if不管在什么情况下,汇编的代码都是逐个分支判断。
switch case
switch相对于if,它的判断值有一些限制,除了字符串、结构体、联合体 和 指针 等,剩下的数据类型都可以做判定值。
从上面的汇编代码可以看出,switch 把所有判断都集中在一起,这里集中判断的部分汇编代码叫做跳转表, 满足哪个条件就跳转到对应的语句。通过这种判断方式,使得程序能够快速定位要要执行的位置,且不需要遍历全部分支。
需要注意的是,虽然跳转表很方便效率也很高,但是这只适用于参数值相差不大的情况(部分编译器可能优化了这个问题),在值相差过多的情况下 switch 采用的将还是 if 判断的方式。
综上所述,switch 的特点如下:
switch可以判断多个整数数值,多字符串;
switch转化为汇编使用的是表结构,根据case的值获得表结构的偏移量,从而获取对应的值,效率高,当case值变成不连续且相差较大的常量之后,汇编代码里使用的结构变成了分支结构;
当case值为连续且相差不大时,编译器使用表结构进行优化,速度快于if;但是其他情况下和if基本一致,但是if的判断值范围很广,switch只能判断常量。
总结
if 无论在什么情况下都采用遍历的方式执行,判定条件的范围广;
switch 在判断值相差较小的时候通过跳转表使得执行效率高于遍历;但判断值相差较大的时候和 if 一样,进行遍历,效率与 if 基本一致。
以下是将C语言转化为汇编代码用的网站:
https://godbolt.org/