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;
}
這是因為以上的程式碼中,default 與 case 屬於同一區塊,而初始可能被跳過,如果真的要在 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) {
//...
}

