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位置【转】相关推荐

  1. 在switch语句中,case后的标号只能是什么?

    switch语句用于基于不同条件执行不同动作. 语法格式: switch (变量表达式) { case 常量1: 语句;break; case 常量2: 语句;break; case 常量3: 语句; ...

  2. c语言case标号是连续的吗,在switch语句中,case后的标号只能是什么?_后端开发...

    在switch语句中,case后的标号只能是常量表达式.在一个特定的switch语句中,每一个case常量都必须具有举世无双的值,不能够反复.然则switch语句能够包括多个case标签. switc ...

  3. 教妹学Java(十四):switch 语句详解

    大家好,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员.本篇文章通过我和三妹对话的形式来谈一谈"switch 语句". 教妹学 Java,没见过这么有趣的标题吧?&q ...

  4. switch语句的执行顺序

    标准的switch语句用法 integral-selector 位置填入选择因子,一般为变量或者表达式,此处的类型应于 integral-values 处的类型保持一致: integral-value ...

  5. switch c语言格式,switch语句格式是什么?

    switch语句 Switch在一些计算机语言中是保留字,其作用大多情况下是进行判断选择:常和case.break.default一起使用. switch语句可以用于基于不同的条件来执行不同的动作. ...

  6. JS 丨JavaScipt条件语句+switch语句学习笔记(四)

    目录 第1章 条件语句 1.1 if 语句 1.2 if...else 语句 1.3 if-else if-else 语句 第2章 switch 语句 2.1 switch语句中-default 关键 ...

  7. C语言if switch语句的基本用法

    一.if 1.if语句的一般形式: if(表达式) 语句1    //(表达式可以是关系表达式,逻辑表达式,甚至是数值表达式) [else语句2] 根据if语句的一般形式,if语句可以写成不同的形式, ...

  8. c#语言swith的用法,C# switch 语句 | Microsoft Docs

    switch(C# 参考) 04/09/2019 本文内容 本文介绍 switch 语句. 有关 switch 表达式(在 C# 8.0 中引入)的信息,请参阅 表达式和运算符部分中有关 switch ...

  9. C 判断 —— switch语句(多个switch值与一组语句联系起来、case顺序是可任意的,default不一定是最后一个case)

    一个 switch 语句允许测试一个变量等于多个值时的情况.每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查. 流程图 //下面的语句是由用户输入的char变量值来控 ...

  10. php switch case default,switch语句中必须有default选项吗?

    switch语句中不是必须有default选项的.switch语句首先会找满足条件的case值做为执行后面的程序入口,若所有的case都不满足,则找default入口,若未找到则退出整个语句:defa ...

最新文章

  1. ZVM – 记VMP保护代码还原工程
  2. SQL点滴1—SET QUOTED_IDENTIFIER OFF语句的作用
  3. Visual Studio 15.4发布,新增多平台支持
  4. boost::spirit模块实现展示不同容器类型的输出格式化的统一和简单的方法
  5. 密码学系列之:明文攻击和Bletchley Park
  6. [转载]SQL Plus 一些使用技巧
  7. 深度解读 MongoDB 最全面的增强版本 4.4 新特性
  8. ping通网关 ping不通dns
  9. 陈艳青(为奥运冠军名字作诗)
  10. logback日志配置文件
  11. Android抓包方法(二) 之Tcpdump命令+Wireshark
  12. Python3安装openpyxl
  13. CefSharp 实现拖拉滑动验证Demo
  14. 杜立特尔分解法 MATLAB,杜立特分解法.doc
  15. Chives 集群收割机图文说明
  16. 简单的安卓网络音乐视频播放器app
  17. 微软需要Twitter来对抗Google
  18. CentOS安装scp命令及其scp的使用
  19. NoSql数据库简介及Redis学习
  20. 自动控制原理-频率特性 G(jw ) 定义

热门文章

  1. 18.数组(一)之认识java数组
  2. React中state与props介绍与比较
  3. [51单片机] 四相五线减速比为1/64步进电机驱动设计
  4. [iOS]delegate和protocol
  5. Spring安全权限管理(Spring Security的配置使用)
  6. spark通过合理设置spark.default.parallelism参数提高执行效率
  7. ZooKeeper 安装与部署
  8. 冲刺第七天 12.3 MON
  9. 空间索引 - 各数据库空间索引使用报告
  10. CISCO OSPF-NSSA实验