switch中case與default的順序
先來看幾個例項
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的彙編解析,即它真正被編譯為可執行程式的樣子。
這裡給出的是一般的情況,編譯器可能有各種優化的措施,其彙編程式碼可能和上面的形式不同
但效果是一樣的,只要按照上面的原理去推就可以了。