判斷結構讓程式依條件選擇執行路徑。核心:指定條件、條件為真時執行的區塊、可選的假時區塊。
if (條件) {
// 條件為真執行
}
if (條件) {
// 真
} else {
// 假
}
if (score >= 90) grade = 'A';
else if (score >= 80) grade = 'B';
else if (score >= 70) grade = 'C';
else grade = 'F';
在 if/else 區塊內再包含 if,邏輯層級加深。注意 dangling else 問題:else 總與最近的未配對 if 綁定,建議永遠使用大括號明確範圍。
適用於整數/枚舉/類別可轉整數的多重分支,語法:
switch (運算式) {
case 常數值1:
陳述式群;
break; // 關鍵:防止貫穿
case 常數值2:
陳述式群;
break;
default: // 可選:無匹配時執行
陳述式群;
}
關鍵規則:
case 標籤必須為編譯期常數整數。break 會貫穿執行下一個 case(有時刻意利用)。default 建議保留,處理未預期值。? :表達式層級的簡易分支:
結果 = (條件) ? 真值 : 假值;
範例:int max = (a > b) ? a : b;
| 主題 | 建議 |
|---|---|
| 條件寫法 | 避免 if (x = 5) 賦值錯誤,啟用編譯器警告;習慣 if (5 == x) (Yoda 條件) 或靜態分析工具。 |
| 布林轉換 | 非零即真,零為假。指標、整數、浮點數皆可直接作條件。 |
| 浮點比較 | 勿用 ==,改用 fabs(a-b) < epsilon。 |
| switch 字串 | C++ 原生不支援,改用 if-else 鏈、unordered_map 查表或 enum 映射。 |
| 大括號風格 | 即使單行陳述式,建議加大括號,防維護時引入錯誤。 |
| 提早返回 | Guard Clauses:先處理邊界/錯誤情況 return,主流程保持淺層縮排。 |
if constexpr (std::is_integral_v<T>) { ... }掌握 if/else、switch、?: 三大工具,配合大括號習慣、Guard Clauses、constexpr if,撰寫清晰、健壯、可維護的分支邏輯。