前几天有一个同事询问,switch和case语句中间的代码是否会执行?

本能的认为,不会被执行!!

又想了一下原理,从汇编的角度,无论是switch还是if,最后的汇编代码都是一条条判断语句。

只是在C语言语法上有不同的写法而已,所以我要证明一下我的想法。

一、首先,写一段测试代码:

#include <string.h>
#include <stdio.h>int main(int argc,char* argv[])
{unsigned int uiSwitch;for(uiSwitch = 0;uiSwitch < 5;uiSwitch++){switch(uiSwitch){/* 下面这行Log是否会输出呢? */printf("This is no output log \r\n");case 0:printf("This is %d \r\n",uiSwitch);break;case 1:printf("This is %d \r\n",uiSwitch);break;case 2:printf("This is %d \r\n",uiSwitch);break;case 3:printf("This is %d \r\n",uiSwitch);break;default:printf("This is default %d \r\n",uiSwitch);break;}}return 0;
}

当然,最后执行结果,没有那行Log的输出,如下:

This is 0
This is 1
This is 2
This is 3
This is default 4

二、让我们看看汇编代码:

因为switch语句只有4个case,所以有4个cmp判断语句,用来比较后跳转到对应的case代码中。

当所有cmp的判断都没有成立的情况下,执行default处理中的jmp指令。

所以,switch和case中间的语句不会执行,并且都不生成汇编代码,属于代码Miss。

  400541:    8b 45 fc                mov    -0x4(%rbp),%eax400544:   83 f8 01                cmp    $0x1,%eax400547: 74 27                   je     400570 <main+0x4a>400549: 83 f8 01                cmp    $0x1,%eax40054c: 72 0c                   jb     40055a <main+0x34>40054e: 83 f8 02                cmp    $0x2,%eax400551: 74 33                   je     400586 <main+0x60>400553: 83 f8 03                cmp    $0x3,%eax400556: 74 44                   je     40059c <main+0x76>400558: eb 58                   jmp    4005b2 <main+0x8c>

[main函数全部汇编]

0000000000400526 <main>:
#include <string.h>
#include <stdio.h>int main(int argc,char* argv[])
{400526:    55                      push   %rbp400527:  48 89 e5                mov    %rsp,%rbp40052a: 48 83 ec 20             sub    $0x20,%rsp40052e:    89 7d ec                mov    %edi,-0x14(%rbp)400531:  48 89 75 e0             mov    %rsi,-0x20(%rbp)unsigned int uiSwitch;for(uiSwitch = 0;uiSwitch < 5;uiSwitch++)400535: c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)40053c:   e9 8a 00 00 00          jmpq   4005cb <main+0xa5>{switch(uiSwitch)400541:    8b 45 fc                mov    -0x4(%rbp),%eax400544:   83 f8 01                cmp    $0x1,%eax400547: 74 27                   je     400570 <main+0x4a>400549: 83 f8 01                cmp    $0x1,%eax40054c: 72 0c                   jb     40055a <main+0x34>40054e: 83 f8 02                cmp    $0x2,%eax400551: 74 33                   je     400586 <main+0x60>400553: 83 f8 03                cmp    $0x3,%eax400556: 74 44                   je     40059c <main+0x76>400558: eb 58                   jmp    4005b2 <main+0x8c>{/* 下面这行Log是否会输出呢? */printf("This is no output log \r\n");case 0:printf("This is %d \r\n",uiSwitch);40055a:  8b 45 fc                mov    -0x4(%rbp),%eax40055d:   89 c6                   mov    %eax,%esi40055f: bf 64 06 40 00          mov    $0x400664,%edi400564:    b8 00 00 00 00          mov    $0x0,%eax400569: e8 92 fe ff ff          callq  400400 <printf@plt>break;40056e:  eb 57                   jmp    4005c7 <main+0xa1>case 1:printf("This is %d \r\n",uiSwitch);400570: 8b 45 fc                mov    -0x4(%rbp),%eax400573:   89 c6                   mov    %eax,%esi400575: bf 64 06 40 00          mov    $0x400664,%edi40057a:    b8 00 00 00 00          mov    $0x0,%eax40057f: e8 7c fe ff ff          callq  400400 <printf@plt>break;400584:  eb 41                   jmp    4005c7 <main+0xa1>case 2:printf("This is %d \r\n",uiSwitch);400586: 8b 45 fc                mov    -0x4(%rbp),%eax400589:   89 c6                   mov    %eax,%esi40058b: bf 64 06 40 00          mov    $0x400664,%edi400590:    b8 00 00 00 00          mov    $0x0,%eax400595: e8 66 fe ff ff          callq  400400 <printf@plt>break;40059a:  eb 2b                   jmp    4005c7 <main+0xa1>case 3:printf("This is %d \r\n",uiSwitch);40059c: 8b 45 fc                mov    -0x4(%rbp),%eax40059f:   89 c6                   mov    %eax,%esi4005a1: bf 64 06 40 00          mov    $0x400664,%edi4005a6:    b8 00 00 00 00          mov    $0x0,%eax4005ab: e8 50 fe ff ff          callq  400400 <printf@plt>break;4005b0:  eb 15                   jmp    4005c7 <main+0xa1>default:printf("This is default %d \r\n",uiSwitch);4005b2:    8b 45 fc                mov    -0x4(%rbp),%eax4005b5:   89 c6                   mov    %eax,%esi4005b7: bf 72 06 40 00          mov    $0x400672,%edi4005bc:    b8 00 00 00 00          mov    $0x0,%eax4005c1: e8 3a fe ff ff          callq  400400 <printf@plt>break;4005c6:  90                      nopint main(int argc,char* argv[])
{unsigned int uiSwitch;for(uiSwitch = 0;uiSwitch < 5;uiSwitch++)4005c7:   83 45 fc 01             addl   $0x1,-0x4(%rbp)4005cb:   83 7d fc 04             cmpl   $0x4,-0x4(%rbp)4005cf:   0f 86 6c ff ff ff       jbe    400541 <main+0x1b>printf("This is default %d \r\n",uiSwitch);break;}}return 0;4005d5:   b8 00 00 00 00          mov    $0x0,%eax4005da: c9                      leaveq 4005db:  c3                      retq   4005dc:  0f 1f 40 00             nopl   0x0(%rax)

以上,没啦

C语言中switch和case之间的语句是否执行?(答案:不执行)相关推荐

  1. C语言switch中break的作用,C语言中switch...case语句中break的重要性

    在C语言中switch...case语句是经常用到的,下面我介绍一下在使用该语句时候需要注意的一个细节问题.话不多说,直接举例子: 例子1: switch(fruit) { case 1:printf ...

  2. c语言 case break,C语言中switch...case语句中break的重要性

    在C语言中switch...case语句是经常用到的,下面我介绍一下在使用该语句时候需要注意的一个细节问题.话不多说,直接举例子: 例子1: switch(fruit) { case 1:printf ...

  3. c语言中switch的用法是什么?

    c语言中switch的用法是: 功能:switch语句是多分支选择语句.用来实现多分支选择结构.if语句只有两个分支可供选择,而实际问题中常常要用到多分支的选择.例如,学生成绩分类(90为" ...

  4. c语言中switch结构,switch结构c语言

    C语言中switch结构的使用 用switch结构编制程序,输入1个学生的C语言课程考试成绩(百分制整形数因为case后面不能接范围,也就是说case后面是一个确实固定的常量.用下面的方法比较好, # ...

  5. c语言switch语句支持的字符有哪些,C语言中switch()语句的括号内可以是什么型别的呢?...

    C语言中switch()语句的括号内可以是什么型别的呢?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言中swit ...

  6. c语言switch语句最大嵌套数,浅谈C语言中switch 语句的嵌套使用

    浅谈C语言中switch 语句的嵌套使用 作者:未知 [摘要]switch语句是一种分支控制语句,它的应用在程序设计中起至了很重要的作用.由于其格式复杂,对于初学者来说很难掌握,switch语句的嵌套 ...

  7. c语言中switch扑克牌花色,c语言中switch的用法

    c语言中switch的用法 c语言中switch的用法的用法如下:C语言还提供了另一种用于多分支选择的switch语句, 其一般形式为:switch(表达式){case 常量表达式1: 语句1;cas ...

  8. Go 语言中 switch 类型断言用法

    Author mogd 2022-05-09 Update mogd 2022-05-09 Adage Don't live in the past. 目录 Go 语言中 switch 类型断言的用法 ...

  9. C语言中switch case语句的实现

    在程序中我们经常用到switch case,它的用法就不再用多说了.计算switch中的值然后比较,跳转到相应的分支.很多人说在编译是时通过转化成if..else来实现的.但实际使用时尤其在调试代码时 ...

最新文章

  1. java中d怎样转换D,Java中的一些基本转换
  2. 初学者python用哪个版本好-什么是Python?初学者应该学python哪个版本?
  3. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)
  4. java如何创造一个整数的类_【技术干货】Java 面试宝典:Java 基础部分(1)
  5. 微信小程序开发教程第七章:微信小程序编辑名片页面开发
  6. php qq接收不了,php imap接收qq邮件的问题
  7. 第二:Java+MyBatis(深入学习)
  8. PHP基础学习课程强烈推荐
  9. DSSM核心思想是把查询文本(query)和内容文本(doc)映射到同维度的语义空间中, 以最优化查询文本和内容文本的语义向量之间的余弦相似度为目的
  10. Java自学要多久?
  11. oracle12 client 64位,oracle官方64位客户端-instantclient-basic-windows.x64-12.2.0.1.0.zip
  12. 金山词霸 [2009牛津版] 金山词霸pdf插件
  13. 使用bable打包js
  14. 使用XShell通过Linux跳板机连接内网服务器
  15. matlab中alw,MATLAB环境下遗传算法优化工具箱的应用_刘万林
  16. 姊妹篇:我是一块声卡
  17. 《纯技术分析阿里云OS和Android之间的关系》补充
  18. mysql修改数据库编码级_修改mysql数据库编码
  19. 智能楼宇实训室空间设计
  20. 浅识一下GFS分布式文件系统

热门文章

  1. Bosun提供的Api
  2. 【蒙古文】:传统蒙古语网页显示方法
  3. 彩虹代shua最新6.6版本源码/修改版/后台同步官方版本升级
  4. 语音分离speech separation数据准备,开源
  5. 对于拓扑空间的一些理解
  6. 12条标准判定穷富:整天工作的人当不了富翁
  7. C/C++知识总结:进程线程面试题
  8. 香港电讯亮相2022年算网融合产业发展峰会,荣获SD-WAN+云网融合优秀服务奖
  9. linux下MongoDB客户端shell基本操作
  10. 移动端IOS-抓包工具Stream