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 case语句为什么要加break的更多相关文章
- java学习笔记08-switch case语句
switch是一种选择语句,可以通过匹配某个条件,来执行某块代码 switch(expression){ case value: break;//可选 default://可选 //语句 } swit ...
- Go丨语言学习笔记--switch
Java语言与Go语言的switch对比 Go语言 switch str { case "yes" : do something ... case "no" d ...
- c语言学习笔记-switch
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.switch函数意义 选择性执行 二.switch函数结构 switch(表达式) { case: 常量表达式; 语句1; ...
- 吴裕雄--天生自然 JAVA开发学习:switch case 语句
public class Test { public static void main(String args[]){ //char grade = args[0].charAt(0); char g ...
- Go语言学习笔记六: 循环语句
Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...
- Go语言学习笔记五: 条件语句
Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...
- Go语言学习笔记(1)——顺序编程
Go语言学习笔记这一堆主要是<Go语言编程>(人民邮电出版社)的读书笔记.中间会穿插一些零碎的点,比如源码学习之类的.大概就是这样吧. 1. 顺序编程 1.1 变量 变量的声明: var ...
- 为什么说在使用多条件判断时switch case语句比if语句效率高?
在学习JavaScript中的if控制语句和switch控制语句的时候,提到了使用多条件判断时switch case语句比if语句效率高,但是身为小白的我并没有在代码中看出有什么不同.去度娘找了半个小 ...
- Python | 基础系列 · Python为什么没有switch/case语句?
与我之前使用的所有语言都不同,Python没有switch/case语句.为了达到这种分支语句的效果,一般方法是使用字典映射: def numbers_to_strings(argument): sw ...
随机推荐
- SSM框架(1)
Spring MVC Framework有这样一些特点: 它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是java组件.并且和Spring提供的其他基础结构紧密集成. 不依 ...
- 在Git远程管理项目
新建repository 本地目录下,在命令行里新建一个代码仓库(repository) 里面只有一个README.md 命令如下: touch README.md git init 初 ...
- 转载FPGA学习之内嵌乘法器调用
补充一点,除法的时候如果直接a/b那么就会调用lpm模块,不管输入是否是常数,乘法的时候输入都是reg型变量会调用硬件乘法器,有一个是常数就会调用lpm模块. 上课的时候一直听老师说真正实践的时候你别 ...
- 关于setdefault和defaultdict
c参考链接:http://blog.csdn.net/real_ray/article/details/17919289 defaultdict就是为没有的键给一个默认的值,实际是实现了一个__mis ...
- debian下ror新建项目报错解决
一个是缺少mysql的开发包 sudo apt-get install libmysqld-dev 还有一个报错如下 debian ExecJS::RuntimeUnavailable: Could ...
- zk 06之:ZooKeeper命令、命令行工具及简单操作
常用命令ZooKeeper 支持某些特定的四字命令字母与其的交互.它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息.用户在客户端可以通过 telnet 或 nc 向 ZooK ...
- JAVA 比较两个日期相差的天数
在实际的应用中,我们经常会比较两个日期相差的天数,下面我们通过java方法判断两个日期所差的额天数. 具体内容,请看下面的代码: package com.jd.jr.fclient.test; imp ...
- 如何正确且成功破解跨平台数据库管理工具DbVisualizer?(图文详解)
前期博客 基于JDBC的跨平台数据库管理工具DbVisualizer安装步骤(图文详解)(博主推荐) 上图,所示,说明这个还只是免费版而已,没又破解为Pro版本. 接下来,就是带领大家如何正确且成功破 ...
- BIOS设置fn
在BIOS中可以设置fn开启或者关闭,但可能有某些电脑设置了也无效,可能需要更新BIOS驱动等等.
- Node.js的原型继承函数util.inherits
util.inherits(constructor, superConstructor)是一个实现对象间原型继承 的函数.JavaScript 的面向对象特性是基于原型的,与常见的基于类的不同.Jav ...