zoukankan      html  css  js  c++  java
  • 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语句,少一些人类的负担。

  • 相关阅读:
    Android--用DownLoadManager下载完成后启动安装
    如何配置远程mysql服务器
    Appium python API 总结
    安装Appium-windows
    如何安装appium-linux
    Appium scroll 滑动查找
    monkeyrunner 自动化测试 图片对比的实现
    用alarmmanager 多次发送PendingIntent
    android 学习中的一些问题记录 主要是概念问题
    Citrix Xen Desktop安装配置
  • 原文地址:https://www.cnblogs.com/yfish/p/9644255.html
Copyright © 2011-2022 走看看