c语言switch为什么要加break,c语言学习笔记 switch case语句为什么要加break
先來看一個(gè)沒有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語句只是被編譯成了一個(gè)具體的入口地址,但是并沒有告訴程序怎么出來,從哪里出來,那么如果沒有出口地址,那么程序就會按順序執(zhí)行下去,所以case2入口地址處的代碼也被執(zhí)行了。
如果是加了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語句被編譯成了一個(gè)jmp,跳轉(zhuǎn)語句,那么再執(zhí)行case1的過程中,自然會遇到j(luò)mp語句,而這個(gè)跳轉(zhuǎn)語句正好把case2給跳過去了。
其實(shí)我覺得這種情況完全可以讓編譯器自動添加break語句,少一些人類的負(fù)擔(dān)。
總結(jié)
以上是生活随笔為你收集整理的c语言switch为什么要加break,c语言学习笔记 switch case语句为什么要加break的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在地下城中“直接杀BOSS”和“刷全图”
- 下一篇: 独有英雄剧情介绍