c语⾔switch为什么要加break,c语⾔学习笔记switchcase语句
为什么要加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)
switch语句必须使用break吗
{
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语句,少⼀些⼈类的负担。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。