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

猜你喜欢

转载自www.cnblogs.com/yfish/p/9644255.html