- 兄弟们--今天有时间研究这个
switch了。哪里有不对的地方,大家可以指指点点
1. switch-case简单分析
-
- 首先。我们写一个简单的
switch语句
- 首先。我们写一个简单的
void judgeSwitch(int a){
switch (a) {
case 10:
printf("我是小明\n");
break;
case 2:
printf("我是小白\n");
break;
case 7:
printf("我是小黑\n");
break;
default:
printf("我是小谷\n");
break;
}
}
-
- 在好多人眼里,
switch-case和if-else差不多,都是个判断选择~
- 在好多人眼里,
-
- 但是也流传着一句话:
switch-case比if-else好
- 但是也流传着一句话:
哦吼~,我们今天找到了主要目标了,为什么会流传着这么一句话?
2. switch-case汇编分析
还是上面的代码~
-
- 调用:
judgeSwitch(5);
- 调用:
-
- 我们通过汇编看下
switch-case和if-else有什么异同?
- 我们通过汇编看下
我们
分析汇编看到:还是不停的判断,不停的跳转。
感觉和
if-else没啥区别~
-
- 疑问:但是上面的为啥要让
传入的参数减去0x2呢?(我怀疑是最小的case,但是我没有证据~)
- 疑问:但是上面的为啥要让
2.1. case个数为4个
既然没有证据,那就寻找下证据~
-
- 这个时候,我加入了一个比
2还小的case(也就是1了~)
- 这个时候,我加入了一个比
-
- 代码
void judgeSwitch(int a){
switch (a) {
case 10:
printf("我是小明\n");
break;
case 2:
printf("我是小白\n");
break;
case 7:
printf("我是小黑\n");
break;
case 1:
printf("我是小芳\n");
break;
default:
printf("我是小谷\n");
break;
}
}
把小芳加入,看看效果是不是减一了~
2.1.1 switch-case 的D炸天操作
-
- 我们继续上面的问题:看
汇编代码是不是减一了
- 我们继续上面的问题:看
他果然是
减一了
-
- 但是这个时候我们发现了新的情况:与
if-else不同了,粗略看好像是通过一次比较--然后地址偏移取值~他怎么做到了?
- 但是这个时候我们发现了新的情况:与
-
- 我们带着疑问,仔细分析一波~
-
- 不经意间再次感叹
LLVM的强大
- 不经意间再次感叹
3. switch-case流程总结
- 小谷非常细心的画了一波流程图(有点丑~兄弟们不要取笑我)
4. 总结
-
- 兄弟们常说的
switch-case比if-else好是有原因的~
- 兄弟们常说的
-
switch的条件判断的区间是有限制有规律的,不能差距过大
-
case个数只有大于等于4个的时候才会比if-else有优势
-
switch的参数是我们定义的,case也是我们开发者写的----所以,兄弟们可以搞起来了
-
- 当然,最后一步要感谢了! 哈哈哈,就希望和兄弟们共同进步吧。