switch 條件判斷


switch 可用來比較數值或字元,語法架構如下:

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

首先看看 switch 的括號,當中置放要取出數值的變數或運算式,取得數值之後,會與 case 設定的數字或字元比對,如果符合就執行以下的陳述句,直到遇到 break 後離開 switch 區塊,若沒有符合的數值或字元,會執行 default 後的陳述句,default 不需要時可以省略。

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

#include <iostream>
using namespace std;

int main() { 
    int score = 0; 

    cout << "輸入分數:"; 
    cin >> score; 

    switch(score / 10) { 
        case 10: case 9: 
            cout << "得 A" << endl; 
            break; 
        case 8: 
            cout << "得 B" << endl; 
            break; 
        case 7: 
            cout << "得 C" << endl; 
            break; 
        case 6: 
            cout << "得 D" << endl; 
            break; 
        default: 
            cout << "得 E(不及格)" << endl; 
            break;
    } 

    return 0;
}

執行結果:

輸入分數:85
得 B

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

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

switch(v) {
    case 1: 
        int x = 0; // 宣告並初始變數
        cout << x << endl;
        break;
    default: // error: jump to case label
             // note:   crosses initialization of 'int x'
        cout << "default\n";
        break;
}

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

switch(v) {
    case 1: 
        {
            int x = 0; // 宣告並初始變數
            cout << x << endl;
        }
        break;
    default: 
        cout << "default\n";
        break;
}

多數的開發者習慣將 default 寫在 switch 最後,在這類情況下,default 中的 break 常會省略;不過實際上,default 也可以寫在一開始:

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

這時就得記得寫 break 了,有些開發者也因此有個習慣,無論 default 是寫在開頭或結尾,都會加上 break

對於底下的寫法:

int size = foo.getSize();
switch(size) {
    //...
}

size 如果只用於 switch 判斷或其區塊,在 C++ 17 時可以寫為(目前我用的 g++ 必須加上 -std=c++17 才可以通過編譯):

switch(int size = foo.getSize(); size) {
    //...
}