c语言switch为什么要加break,c语言学习笔记 switch case语句为什么要加break
先来看一个没有break的例子:
int main()
{
int a = 1;
switch (a)
{
case 1:
printf("1");
case 2:
printf("2");
}
}
我们看一下它的汇编代码:
switch (a)
0137181F mov eax,dword ptr [a]
01371822 mov dword ptr [ebp-0D0h],eax
01371828 cmp dword ptr [ebp-0D0h],1
0137182F je main+4Ch (0137183Ch)
01371831 cmp dword ptr [ebp-0D0h],2
01371838 je main+59h (01371849h)
0137183A jmp main+66h (01371856h)
{
case 1:
printf("1");
0137183C push offset string "1" (01377B30h)
01371841 call _printf (0137104Bh)
01371846 add esp,4
case 2:
printf("2");
01371849 push offset string "2" (01377B34h)
0137184E call _printf (0137104Bh)
01371853 add esp,4
可以看一下,case语句只是被编译成了一个具体的入口地址,但是并没有告诉程序怎么出来,从哪里出来,那么如果没有出口地址,那么程序就会按顺序执行下去,所以case2入口地址处的代码也被执行了。
如果是加了break语句之后就变成下面这样了:
switch (a)
00AC181F mov eax,dword ptr [a]
00AC1822 mov dword ptr [ebp-0D0h],eax
00AC1828 cmp dword ptr [ebp-0D0h],1
00AC182F je main+4Ch (0AC183Ch)
00AC1831 cmp dword ptr [ebp-0D0h],2
00AC1838 je main+5Bh (0AC184Bh)
00AC183A jmp main+68h (0AC1858h)
{
case 1:
printf("1");
00AC183C push offset string "1" (0AC7B30h)
00AC1841 call _printf (0AC104Bh)
00AC1846 add esp,4
break;
00AC1849 jmp main+68h (0AC1858h)
case 2:
printf("2");
00AC184B push offset string "2" (0AC7B34h)
00AC1850 call _printf (0AC104Bh)
00AC1855 add esp,4
break语句被编译成了一个jmp,跳转语句,那么再执行case1的过程中,自然会遇到jmp语句,而这个跳转语句正好把case2给跳过去了。
其实我觉得这种情况完全可以让编译器自动添加break语句,少一些人类的负担。
c语言switch为什么要加break,c语言学习笔记 switch case语句为什么要加break相关推荐
- Python语言入门这一篇就够了-学习笔记(十二万字)
Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...
- 0.《新概念51单片机C语言教程》(郭天祥)学习笔记
看到之前的阅读量,有标题党的嫌疑,再接再厉,加油坚持自己的文风,相信会写的越来越好:) 继续更(一个人,一个记事本,一个PDF阅读器,装备全靠打) <新概念51单片机C语言教程>(郭天祥) ...
- Feko加载电容方法学习笔记
Feko加载电容方法学习笔记 文章目录 1. 初始模型 2.Port1加大电阻 3. 改变Port1电压值 4. 加载电容值 Feko软件可以加上匹配电路进行联合仿真,也可以加载电容,电感进行匹配,这 ...
- 0-c语言入门这一篇就够了-学习笔记(一万字)
内容来自慕课网,个人学习笔记.加上了mtianyan标签标记知识点. C语言入门 -> Linux C语言编程基本原理与实践 -> Linux C语言指针与内存 -> Linux C ...
- scala语言的底层是java实现的_Scala学习笔记一(与Java、Jvm的关系以及程序执行流程分析)...
一.Scala语言与Java.Jvm的关系分析 Scala语言是马丁奥德斯基接触Java语言后,针对Java语言的特点,将函数式编程语言的特点融合到Java中,由此发明的.Scala语言和Java语言 ...
- JVM学习笔记之-类加载子系统,类的加载与类的加载过程,双亲委派机制
一 类加载器与类加载过程 类加载子系统作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识. ClassLoader只负责class文件的加载,至于 ...
- 【动画消消乐】纯CSS加载/过渡动画学习笔记合集(1-50)
Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 自我介绍一下 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入 ...
- Unity学习笔记(5):动态加载Prefab
第一种方法,从Resources文件夹读取Prefab Assets/Resources文件夹是Unity中的一个特殊文件夹,在博主当前的认知里,放在这个文件夹里的Prefab可以被代码动态加载 直接 ...
- contiki学习笔记(六)contiki程序加载器和多线程库
六.contiki程序加载器 contiki程序加载器是一个用于加载和启动程序的抽象接口. Data Structures struct dsc//DSC程序描述结构. ModulesThe Cont ...
最新文章
- 腾讯面试:打家劫舍 III
- 声学漫谈之六:音腔频段如何判定?
- 读写分离,读写分离死锁解决方案,事务发布死锁解决方案,发布订阅死锁解决方案|事务(进程 ID *)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务...
- 走近分形与混沌(part13)--自然现象就其本质来说,是复杂而非线性的
- python爬虫笔记(七):实战(三)股票数据定向爬虫
- [Java基础]自定义注解 格式本质
- 7-14 求整数段和
- springMVC 简单事例
- 使用xftp无法连接阿里云服务器 或者linux
- C++ 实现CRC循环冗余校验码
- Android Studio报错Error:java.lang.RuntimeException: Crunching Cruncher xx.png failed, see logs
- 什么是公网ip?--快解析科普
- 苹果手机开热点电脑/安卓手机无法链接?
- k8s 服务注册与发现(二)Kubernetes内部域名解析原理
- Flutter学习日记之使用路由进行页面切换
- 用坚果云同步mysql_坚果云安装完成以后, 如何同步文件?
- Python趣用—配平化学方程式
- 笔记本更换固态硬盘的教程
- Spark的调度流程(任务调度+资源调度)
- 【唐老狮】C#——转义字符