先来看一个没有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 case语句为什么要加break的更多相关文章

  1. java学习笔记08-switch case语句

    switch是一种选择语句,可以通过匹配某个条件,来执行某块代码 switch(expression){ case value: break;//可选 default://可选 //语句 } swit ...

  2. Go丨语言学习笔记--switch

    Java语言与Go语言的switch对比 Go语言 switch str { case "yes" : do something ... case "no" d ...

  3. c语言学习笔记-switch

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.switch函数意义 选择性执行 二.switch函数结构 switch(表达式) { case: 常量表达式; 语句1; ...

  4. 吴裕雄--天生自然 JAVA开发学习:switch case 语句

    public class Test { public static void main(String args[]){ //char grade = args[0].charAt(0); char g ...

  5. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

  6. Go语言学习笔记五: 条件语句

    Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...

  7. Go语言学习笔记(1)——顺序编程

    Go语言学习笔记这一堆主要是<Go语言编程>(人民邮电出版社)的读书笔记.中间会穿插一些零碎的点,比如源码学习之类的.大概就是这样吧. 1. 顺序编程 1.1 变量 变量的声明: var ...

  8. 为什么说在使用多条件判断时switch case语句比if语句效率高?

    在学习JavaScript中的if控制语句和switch控制语句的时候,提到了使用多条件判断时switch case语句比if语句效率高,但是身为小白的我并没有在代码中看出有什么不同.去度娘找了半个小 ...

  9. Python | 基础系列 · Python为什么没有switch/case语句?

    与我之前使用的所有语言都不同,Python没有switch/case语句.为了达到这种分支语句的效果,一般方法是使用字典映射: def numbers_to_strings(argument): sw ...

随机推荐

  1. DispatcherServlet的处理流程

    前言 上一篇介绍了SpringMVC的启动过程,DispatcherServlet作为一个前端控制器,分发处理http请求 1.DispatcherServlet流程图 具体流程: 1. 用户发请求- ...

  2. openfaas 简单试用

    1. 安装 faas-cli  参考以前文章,或者使用官方的shell脚本   2. 简单例子 mkdir rong cd rong faas-cli new rong --lang python / ...

  3. centos 7 bbr 安装

    1. 准备 升级内核需要4.9 以及以上   2.  yum  内核升级       a. 添加 ELRepo 源 GPG key rpm --import https://www.elrepo.or ...

  4. Python函数 help()

    **help() 功能: help() 函数用于查看函数或模块用途的详细说明.object -- 对象:返回对象帮助信息. 语法: help([object]) 实例: >>>hel ...

  5. List,ArrayList

    List是一个接口,而ListArray是一个类. ListArray继承并实现了List. 所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造. Lis ...

  6. JGroups 入门实践

    前言 JGroups是一个开源的纯java编写的可靠的群组通讯工具.其工作模式基于IP多播,但可以在可靠性和群组成员管理上进行扩展.其结构上设计灵活,提供了一种灵活兼容多种协议的协议栈. JGroup ...

  7. laravel修改命名空间中的App为各自项目的名称(个人喜好)

    学习源头:https://blog.csdn.net/xx1129244705/article/details/77965618 laravel框架的应用默认命名空间是App,修改命名空间的可通过ap ...

  8. 对DDS的深度认识

    我知道,我对与电子有关的所有事情都很着迷,但不论从哪个角度看,今天的现场可编程门阵列(FPGA),都显得“鹤立鸡群”,真是非常棒的器件.如果在这个智能时代,在这个领域,想拥有一技之长的你还没有关注FP ...

  9. HDOJ5877(dfs序+离散化+树状数组)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  10. (转)VS2008 VMware联合调试

    本文转载自:http://www.cnblogs.com/ziwuge/archive/2012/04/03/2431162.html 一.前期准备: 1. 安装VS2008 2. 安装VM8.0,在 ...