switch 條件判斷


switch 的語法架構如下:

switch (變數名稱或運算式) { 
    case 符合數字或字元: 
        陳述句一; 
        break; 
    case 符合數字或字元: 
        陳述句二; 
        break; 
    default: 
        陳述三; 
}

首先看看 switch 的括號,當中置放要取出數值的變數,取出數值之後,程式會開始與 case 設定的數字或字元比對,如果符合就執行以下的陳述句,直到遇到 break 後離開 switch 區塊,如果沒有符合的數值或字元,則會執行 default 後的陳述句,default 不一定需要,可以省去這個部份。

來看看〈if 條件判斷〉中的成績等級比對,如何使用 switch 來改寫:

#include <stdio.h>

int main(void) {
    int score = 0; 
    int level = 0; 

    printf("輸入分數:"); 
    scanf("%d", &score); 
    level = score / 10; 

    switch(level) { 
        case 10: 
        case 9: 
            puts("得 A");
            break; 
        case 8: 
            puts("得 B");
            break; 
        case 7: 
            puts("得 C");
            break; 
        case 6: 
            puts("得 D");
            break; 
        default: 
            puts("得 E(不及格)");
    } 

    return 0;
} 

執行結果:

輸入分數:85
得 B

在這個程式中,使用除法並取得運算後的商數,如果大於 90 的話,除以 10 的商數一定是 9 或 10(100 分時),在 case 10 中沒有任何的陳述,也沒有使用 break,所以會繼續往下執行,直到遇到 break 離開 switch,所以學生成績 100 分的話,也會顯示A的成 績等級;如果比對的條件不在 10 到 6 這些值的話,會執行 default 下的陳述,這表示商數小於 6,所以學生的成績等級就顯示為 E 了。

注意在 case 後的等號是冒號而不是分號,這是初學者很常輸入錯誤的符號;如果比對的是字元,記得加上單引號(''),例如:

case 'A';

case 中若宣告並初始變數,以下是不合法的:

switch(v) {
    case 1: 
        int x = 0; // error: a label can only be part of a statement and a declaration is not a statement
        printf("%d\n", x);
        break;
    default: 
        printf("default\n");
        break;
}

這是因為以上的程式碼中,defaultcase 屬於同一區塊,而初始可能被跳過,如果真的要在 case 中若宣告並初始變數,必須明確定義另一個區塊:

switch(v) {
    case 1: 
        {
            int x = 0; 
            printf("%d\n", x);
        }
        break;
    default: 
        printf("default\n");
        break;
}

如果比對的是一個數值範圍,在 gcc 編譯器的擴充還允許這樣的比對方式:

switch(i) { 
    case 1 ... 30: 
        // statements 
    case 31 ... 1000: 
        // statements 
    default: 
        // statements 
}

如上所示範的,gcc 編譯器的擴充可以使用 ... 來設定一個範圍的數值,而不用連續地撰寫 case 來比對。