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语句,少一些人类的负担。

  • 相关阅读:
    菜鸟学习Spring Web MVC之二
    菜鸟学习Spring Web MVC之一
    Internet Explorer 6 的15个讨厌的bug和简单的解决方法
    前端遇到的跨域问题及解决方案二
    前端遇到的跨域问题及解决方案一
    第六 添加文字
    第五章、使用预绘制图片
    第四、渐变和图案
    第三 画曲线
    第二、画线和路径
  • 原文地址:https://www.cnblogs.com/yfish/p/9644255.html
Copyright © 2011-2022 走看看