switch (表達式) {
case 常量表達式1:
語句序列1;
break; // 可選
case 常量表達式2:
語句序列2;
break;
...
default: // 可選
默認語句序列;
}
1, 0xFF)、字符字面量 (如 'A')、宏定義常量 (如 #define MAX 100)、const 整型變量 (C++ 允許,C 標準不允許,視編譯器而定)。a+b)、case 1.5:、case "str":。int, char, short, long, enum)。long long、指針 (實質整數)。switch (k) {
case 1: cout << "1";
case 2: cout << "2"; // 無 break,k=1 時會連續輸出 "12"
case 3: cout << "3";
}
break 作用:**跳出 switch 整體**,繼續執行 switch 後的語句。case 'a': case 'e': case 'i': case 'o': case 'u': count_vowel++; break;break:終止 switch,**正確用法**。continue:**語法錯誤** (除非 switch 內嵌於循環中,且 continue 屬於該循環)。switch (x) {
default: cout << "d"; // 放最前面也合法
case 1: cout << "1"; break;
case 2: cout << "2"; break;
}
// x=3 輸出 "d";x=1 輸出 "1" (遇到 break 跳出,不執行 default)
int c = 0, k;
for (k = 1; k < 3; k++) {
switch (k) {
default:
c += k; // k=1: 進 default,c=1;無 break → 貫穿
case 2:
c++; // k=1: 貫穿執行 c=2;k=2: 直接進 case 2,c=3
break; // 跳出 switch
case 4:
c += 2;
break;
}
}
printf("%d\n", c); // 輸出 3
跟蹤表:
| k | 進入分支 | 執行語句 | c 變化 |
|---|---|---|---|
| 1 | default (無 case 1) | c+=k (c=1) → 貫穿 case 2: c++ (c=2) → break | 0 → 2 |
| 2 | case 2 | c++ (c=3) → break | 2 → 3 |
break** — 否則 90% 是 Bug。故意貫穿加註釋 // fall through。default** — 即使自以為覆蓋所有值,防禦性編程捕獲非預期值 (可加斷言/日誌)。if-else 鏈。| 場景 | 推薦 | 理由 |
|---|---|---|
| 離散整數值匹配 (≤10 條) | switch | 跳轉表 O(1),代碼清晰,編譯器優化好 |
| 範圍判斷、浮點、字符串、複雜表達式 | if-else | switch 不支持 |
| 大量 case (>20) 且稀疏 | if-else 或查找表 | 跳轉表稀疏浪費空間,編譯器可能退化為 if-else |
| 需按優先級順序判斷 | if-else | switch 無優先級概念 |
掌握 switch 的「跳轉表本質、貫穿機制、標簽常量約束」,配合規範的 break/default 習慣,即可寫出高效、無 Bug 的多分支選擇邏輯。