switch语法中对于有序数简单解读(C语言)

hi,各位:
今天学到了switch这一部分,对于switch/case这部分,在我短暂的代码生涯中出现的机会并不多,一开始我以为这个函数实现就和if/else if/else一样,是通过对数值的多次判断来实现的。然而今天学完之后发现该语法内有乾坤。
首先我们回顾一下switch的语法
在CSDN中是这样描述的:

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
10x98507C+0x4*1
20x98507C+0x4*2
30x98507C+0x4*3
40x98507C+0x4*4
50x98507C+0x4*5

而优化后switch执行汇编我也以图片形式标识出来。
汇编代码详解
内存图
内存图中,下方四个字节四个字节存储的便是代码指针,因为x86为小尾方式存储,所以以红色部分为例子,其代码指针为0x00984FB5,及红色标识长的部分。

写到后面有点乱,先发布后面慢慢改吧,主要是switch的优化算法部分并不明晰。
若要转载麻烦注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值