1. 程式人生 > >switch中case與default的順序

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的彙編解析,即它真正被編譯為可執行程式的樣子。

這裡給出的是一般的情況,編譯器可能有各種優化的措施,其彙編程式碼可能和上面的形式不同

但效果是一樣的,只要按照上面的原理去推就可以了。