【C】——C深入探讨——switch语句的default位置【转】
switch语句中的default位置可以随意放,一开始我想不通,就看了下简单反汇编的,发现原来只是靠default的标记,程序执行时先测试表达式是否满足某个case,若都不满足就跳到default去执行。本人目前还没进军反汇编界,请大牛不要取笑。
下面以两个简单的例子说明:
1)
main()
{
int a = 0;
int o = 0;
a = 4;
switch(a)
{
case 1:
o = 10;
printf("%d\n",o);
case 2:
o = 20;
printf("%d\n",o);
default:
o = 100;
printf("%d\n",o);
case 3:
o = 30;
printf("%d\n",o);
case 4:
o = 40;
printf("%d\n",o);
}
}
这样反汇编出来的是:
switch(a)
{
0040D79D mov eax,dword ptr [ebp-4] ;eax = a
0040D7A0 mov dword ptr [ebp-0Ch],eax ;[ebp-0Ch] = a
0040D7A3 mov ecx,dword ptr [ebp-0Ch] ;ecx = a
0040D7A6 sub ecx,1 ;ecx -= 1
0040D7A9 mov dword ptr [ebp-0Ch],ecx ;[ebp-0Ch] = ecx
0040D7AC cmp dword ptr [ebp-0Ch],3 ;比较[ebp-0ch]和3大小
0040D7B0 ja $L40+18h (0040d7ec) ;ecx大于3则跳到default
0040D7B2 mov edx,dword ptr [ebp-0Ch] ;
0040D7B5 jmp dword ptr [edx*4+40D845h];40D845h应该是指针存放的位置,这里就是跳到相应的case执行
case 1:
这里比较特殊,因为case都是相差1的,编译器做了优化,这样效率高一些。上面是检查a是否超出最大的case 4,超出就跳到default执行,否则就跳到相应的case。
2)
main()
{
int a = 0;
int o = 0;
a = 4;
switch(a)
{
case 1:
o = 10;
printf("%d\n",o);
case 20:
o = 20;
printf("%d\n",o);
default:
o = 100;
printf("%d\n",o);
case 300:
o = 30;
printf("%d\n",o);
case 40:
o = 40;
printf("%d\n",o);
}
}
反汇编代码:
switch(a)
{
0040D79D mov eax,dword ptr [ebp-4]
0040D7A0 mov dword ptr [ebp-0Ch],eax
0040D7A3 cmp dword ptr [ebp-0Ch],28h
0040D7A7 jg main+4Dh (0040d7bd)
0040D7A9 cmp dword ptr [ebp-0Ch],28h
0040D7AD je main+0B8h (0040d828)
0040D7AF cmp dword ptr [ebp-0Ch],1
0040D7B3 je main+58h (0040d7c8)
0040D7B5 cmp dword ptr [ebp-0Ch],14h
0040D7B9 je main+70h (0040d7e0)
0040D7BB jmp main+88h (0040d7f8)
0040D7BD cmp dword ptr [ebp-0Ch],12Ch
0040D7C4 je main+0A0h (0040d810)
0040D7C6 jmp main+88h (0040d7f8) ;这里是跳到default去
case 1:
这里是将各case改得复杂一点,没有规律了,然后程序就必须一个一个的验证case是否满足,都满足的话最后就直接jmp跳到default去执行。
总结:所以在程序中default的位置可以任意,因为编译到exe后,程序执行时先判断所有case,然后再判断是否跳到default的地址(即指针),然后往后执行,遇到break之类的就直接跳到后面去了。(而各case和default的内嵌语句又是顺序的)
【C】——C深入探讨——switch语句的default位置【转】相关推荐
- 在switch语句中,case后的标号只能是什么?
switch语句用于基于不同条件执行不同动作. 语法格式: switch (变量表达式) { case 常量1: 语句;break; case 常量2: 语句;break; case 常量3: 语句; ...
- c语言case标号是连续的吗,在switch语句中,case后的标号只能是什么?_后端开发...
在switch语句中,case后的标号只能是常量表达式.在一个特定的switch语句中,每一个case常量都必须具有举世无双的值,不能够反复.然则switch语句能够包括多个case标签. switc ...
- 教妹学Java(十四):switch 语句详解
大家好,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员.本篇文章通过我和三妹对话的形式来谈一谈"switch 语句". 教妹学 Java,没见过这么有趣的标题吧?&q ...
- switch语句的执行顺序
标准的switch语句用法 integral-selector 位置填入选择因子,一般为变量或者表达式,此处的类型应于 integral-values 处的类型保持一致: integral-value ...
- switch c语言格式,switch语句格式是什么?
switch语句 Switch在一些计算机语言中是保留字,其作用大多情况下是进行判断选择:常和case.break.default一起使用. switch语句可以用于基于不同的条件来执行不同的动作. ...
- JS 丨JavaScipt条件语句+switch语句学习笔记(四)
目录 第1章 条件语句 1.1 if 语句 1.2 if...else 语句 1.3 if-else if-else 语句 第2章 switch 语句 2.1 switch语句中-default 关键 ...
- C语言if switch语句的基本用法
一.if 1.if语句的一般形式: if(表达式) 语句1 //(表达式可以是关系表达式,逻辑表达式,甚至是数值表达式) [else语句2] 根据if语句的一般形式,if语句可以写成不同的形式, ...
- c#语言swith的用法,C# switch 语句 | Microsoft Docs
switch(C# 参考) 04/09/2019 本文内容 本文介绍 switch 语句. 有关 switch 表达式(在 C# 8.0 中引入)的信息,请参阅 表达式和运算符部分中有关 switch ...
- C 判断 —— switch语句(多个switch值与一组语句联系起来、case顺序是可任意的,default不一定是最后一个case)
一个 switch 语句允许测试一个变量等于多个值时的情况.每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查. 流程图 //下面的语句是由用户输入的char变量值来控 ...
- php switch case default,switch语句中必须有default选项吗?
switch语句中不是必须有default选项的.switch语句首先会找满足条件的case值做为执行后面的程序入口,若所有的case都不满足,则找default入口,若未找到则退出整个语句:defa ...
最新文章
- ZVM – 记VMP保护代码还原工程
- SQL点滴1—SET QUOTED_IDENTIFIER OFF语句的作用
- Visual Studio 15.4发布,新增多平台支持
- boost::spirit模块实现展示不同容器类型的输出格式化的统一和简单的方法
- 密码学系列之:明文攻击和Bletchley Park
- [转载]SQL Plus 一些使用技巧
- 深度解读 MongoDB 最全面的增强版本 4.4 新特性
- ping通网关 ping不通dns
- 陈艳青(为奥运冠军名字作诗)
- logback日志配置文件
- Android抓包方法(二) 之Tcpdump命令+Wireshark
- Python3安装openpyxl
- CefSharp 实现拖拉滑动验证Demo
- 杜立特尔分解法 MATLAB,杜立特分解法.doc
- Chives 集群收割机图文说明
- 简单的安卓网络音乐视频播放器app
- 微软需要Twitter来对抗Google
- CentOS安装scp命令及其scp的使用
- NoSql数据库简介及Redis学习
- 自动控制原理-频率特性 G(jw ) 定义
热门文章
- 18.数组(一)之认识java数组
- React中state与props介绍与比较
- [51单片机] 四相五线减速比为1/64步进电机驱动设计
- [iOS]delegate和protocol
- Spring安全权限管理(Spring Security的配置使用)
- spark通过合理设置spark.default.parallelism参数提高执行效率
- ZooKeeper 安装与部署
- 冲刺第七天 12.3 MON
- 空间索引 - 各数据库空间索引使用报告
- CISCO OSPF-NSSA实验