先來看幾個實例
1、
實例源代碼為:
#include<stdio.h>
int main()
{
int i = 2;
switch (i)
{
default:
printf("%s\n", "default");
case 1:
printf("%s\n", "case 1");
case 2:
printf("%s\n", "case 2");
case 3:
printf("%s\n", "case 3");
}
return 0;
}
當i為2時輸出為:
case 2
case 3
當將i該為0時輸出為:
default
case 1
case 2
case 3
2、現在將default語句放在case語句的中間
實例代碼為:
#include<stdio.h>
int main()
{
int i = 2;
switch (i)
{
case 1:
printf("%s\n", "case 1");
default:
printf("%s\n", "default");
case 2:
printf("%s\n", "case 2");
case 3:
printf("%s\n", "case 3");
}
return 0;
}
當i為2時輸出為:
case 2
case 3
當將i改為0時輸出為:
default
case 2
case 3
解析:其實switch語句一般是如下這樣處理的(在編譯器沒有優化的情況下)
【對於上面實例2的代碼,這里用類似匯編代碼的偽代碼來說明其執行過程】
if(i == 1)
jmp to case 1;
else if (i == 2)
jmp to case 2;
else if (i == 3)
jmp to case 3;
else
jmp to default;
case 1: printf("%s\n", "case 1");
default: printf("%s\n", "default");
case 2: printf("%s\n", "case 2");
case 3: printf("%s\n", "case 3");
上面用的說明方式有點不倫不類,但很說明問題。它給出了一種匯編代碼解釋switch語句的方式。
首先判斷i與各個case后的條件值是否相等,然后進行相應的跳轉。不管你編寫的代碼中default
放在那里,這里的條件判斷都是先按順序比較其他非default值,當這些條件都不滿足的時候,
才跳轉到default的相應代碼處執行。將每一種情況的處理代碼加上標號按你的語句給出的順序排
列在開始判斷語句的后面。這就是switch的匯編解析,即它真正被編譯為可執行程序的樣子。
這里給出的是一般的情況,編譯器可能有各種優化的措施,其匯編代碼可能和上面的形式不同
但效果是一樣的,只要按照上面的原理去推就可以了。
還可以參考這里。
你懂了嗎?趕快弄兩個實例驗證一下吧。
