先来看一个没有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相关推荐

  1. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  2. 0.《新概念51单片机C语言教程》(郭天祥)学习笔记

    看到之前的阅读量,有标题党的嫌疑,再接再厉,加油坚持自己的文风,相信会写的越来越好:) 继续更(一个人,一个记事本,一个PDF阅读器,装备全靠打) <新概念51单片机C语言教程>(郭天祥) ...

  3. Feko加载电容方法学习笔记

    Feko加载电容方法学习笔记 文章目录 1. 初始模型 2.Port1加大电阻 3. 改变Port1电压值 4. 加载电容值 Feko软件可以加上匹配电路进行联合仿真,也可以加载电容,电感进行匹配,这 ...

  4. 0-c语言入门这一篇就够了-学习笔记(一万字)

    内容来自慕课网,个人学习笔记.加上了mtianyan标签标记知识点. C语言入门 -> Linux C语言编程基本原理与实践 -> Linux C语言指针与内存 -> Linux C ...

  5. scala语言的底层是java实现的_Scala学习笔记一(与Java、Jvm的关系以及程序执行流程分析)...

    一.Scala语言与Java.Jvm的关系分析 Scala语言是马丁奥德斯基接触Java语言后,针对Java语言的特点,将函数式编程语言的特点融合到Java中,由此发明的.Scala语言和Java语言 ...

  6. JVM学习笔记之-类加载子系统,类的加载与类的加载过程,双亲委派机制

    一 类加载器与类加载过程 类加载子系统作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识. ClassLoader只负责class文件的加载,至于 ...

  7. 【动画消消乐】纯CSS加载/过渡动画学习笔记合集(1-50)

    Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 自我介绍一下 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入 ...

  8. Unity学习笔记(5):动态加载Prefab

    第一种方法,从Resources文件夹读取Prefab Assets/Resources文件夹是Unity中的一个特殊文件夹,在博主当前的认知里,放在这个文件夹里的Prefab可以被代码动态加载 直接 ...

  9. contiki学习笔记(六)contiki程序加载器和多线程库

    六.contiki程序加载器 contiki程序加载器是一个用于加载和启动程序的抽象接口. Data Structures struct dsc//DSC程序描述结构. ModulesThe Cont ...

最新文章

  1. 腾讯面试:打家劫舍 III
  2. 声学漫谈之六:音腔频段如何判定?
  3. 读写分离,读写分离死锁解决方案,事务发布死锁解决方案,发布订阅死锁解决方案|事务(进程 ID *)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务...
  4. 走近分形与混沌(part13)--自然现象就其本质来说,是复杂而非线性的
  5. python爬虫笔记(七):实战(三)股票数据定向爬虫
  6. [Java基础]自定义注解 格式本质
  7. 7-14 求整数段和
  8. springMVC 简单事例
  9. 使用xftp无法连接阿里云服务器 或者linux
  10. C++ 实现CRC循环冗余校验码
  11. Android Studio报错Error:java.lang.RuntimeException: Crunching Cruncher xx.png failed, see logs
  12. 什么是公网ip?--快解析科普
  13. 苹果手机开热点电脑/安卓手机无法链接?
  14. k8s 服务注册与发现(二)Kubernetes内部域名解析原理
  15. Flutter学习日记之使用路由进行页面切换
  16. 用坚果云同步mysql_坚果云安装完成以后, 如何同步文件?
  17. Python趣用—配平化学方程式
  18. 笔记本更换固态硬盘的教程
  19. Spark的调度流程(任务调度+资源调度)
  20. 【唐老狮】C#——转义字符

热门文章

  1. 非常酷!10个基于 HTML5 的字体应用演示网站
  2. JAVASCRIPT常用20种小技巧汇总
  3. css多浏览常见问题
  4. Hibernate关联映射(一对多/多对多)
  5. spring AOP源码分析(一)
  6. 【图像处理】Haar-like特征
  7. 课后作业-阅读任务-阅读笔记-2
  8. 关于eclipse的indigo版中文注释时字体太小的问题(转)
  9. [道理]关于人生的,很不错!
  10. 外中断02 - 零基础入门学习汇编语言70