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) {
//...
}