每日一C(2)if else 和 switch case 的区别

目录

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pQAQqa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值