C语言中switch和case之间的语句是否执行?(答案:不执行)
前几天有一个同事询问,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之间的语句是否执行?(答案:不执行)相关推荐
- C语言switch中break的作用,C语言中switch...case语句中break的重要性
在C语言中switch...case语句是经常用到的,下面我介绍一下在使用该语句时候需要注意的一个细节问题.话不多说,直接举例子: 例子1: switch(fruit) { case 1:printf ...
- c语言 case break,C语言中switch...case语句中break的重要性
在C语言中switch...case语句是经常用到的,下面我介绍一下在使用该语句时候需要注意的一个细节问题.话不多说,直接举例子: 例子1: switch(fruit) { case 1:printf ...
- c语言中switch的用法是什么?
c语言中switch的用法是: 功能:switch语句是多分支选择语句.用来实现多分支选择结构.if语句只有两个分支可供选择,而实际问题中常常要用到多分支的选择.例如,学生成绩分类(90为" ...
- c语言中switch结构,switch结构c语言
C语言中switch结构的使用 用switch结构编制程序,输入1个学生的C语言课程考试成绩(百分制整形数因为case后面不能接范围,也就是说case后面是一个确实固定的常量.用下面的方法比较好, # ...
- c语言switch语句支持的字符有哪些,C语言中switch()语句的括号内可以是什么型别的呢?...
C语言中switch()语句的括号内可以是什么型别的呢?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言中swit ...
- c语言switch语句最大嵌套数,浅谈C语言中switch 语句的嵌套使用
浅谈C语言中switch 语句的嵌套使用 作者:未知 [摘要]switch语句是一种分支控制语句,它的应用在程序设计中起至了很重要的作用.由于其格式复杂,对于初学者来说很难掌握,switch语句的嵌套 ...
- c语言中switch扑克牌花色,c语言中switch的用法
c语言中switch的用法 c语言中switch的用法的用法如下:C语言还提供了另一种用于多分支选择的switch语句, 其一般形式为:switch(表达式){case 常量表达式1: 语句1;cas ...
- Go 语言中 switch 类型断言用法
Author mogd 2022-05-09 Update mogd 2022-05-09 Adage Don't live in the past. 目录 Go 语言中 switch 类型断言的用法 ...
- C语言中switch case语句的实现
在程序中我们经常用到switch case,它的用法就不再用多说了.计算switch中的值然后比较,跳转到相应的分支.很多人说在编译是时通过转化成if..else来实现的.但实际使用时尤其在调试代码时 ...
最新文章
- java中d怎样转换D,Java中的一些基本转换
- 初学者python用哪个版本好-什么是Python?初学者应该学python哪个版本?
- 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)
- java如何创造一个整数的类_【技术干货】Java 面试宝典:Java 基础部分(1)
- 微信小程序开发教程第七章:微信小程序编辑名片页面开发
- php qq接收不了,php imap接收qq邮件的问题
- 第二:Java+MyBatis(深入学习)
- PHP基础学习课程强烈推荐
- DSSM核心思想是把查询文本(query)和内容文本(doc)映射到同维度的语义空间中, 以最优化查询文本和内容文本的语义向量之间的余弦相似度为目的
- Java自学要多久?
- oracle12 client 64位,oracle官方64位客户端-instantclient-basic-windows.x64-12.2.0.1.0.zip
- 金山词霸 [2009牛津版] 金山词霸pdf插件
- 使用bable打包js
- 使用XShell通过Linux跳板机连接内网服务器
- matlab中alw,MATLAB环境下遗传算法优化工具箱的应用_刘万林
- 姊妹篇:我是一块声卡
- 《纯技术分析阿里云OS和Android之间的关系》补充
- mysql修改数据库编码级_修改mysql数据库编码
- 智能楼宇实训室空间设计
- 浅识一下GFS分布式文件系统