條件運算子 ? : 是 C 語言唯一的三元運算子,能以單一表達式實現「二選一」賦值,使代碼更簡潔、高效。本文系統整理語法規則、優先級陷阱、巢狀用法與實戰範例。
expr1 ? expr2 : expr3
expr1 為真(非 0)→ 整體值為 expr2。expr1 為假(0)→ 整體值為 expr3。max = (a > b) ? a : b;// if-else 版
if (a > b) max = a;
else max = b;
// 條件表達式版
max = (a > b) ? a : b;
後者為單一表達式,可直接嵌入其他表達式中(如函式參數、返回值),更具表達力。
max = a > b ? a : b; // 等價 max = (a > b) ? a : b;
括號可省,但建議保留以提升可讀性。
不可單獨使用 ? 或 :,否則編譯錯誤。
a > b ? a : c > d ? c : d;
解析為:
a > b ? a : (c > d ? c : d);
此即巢狀條件表達式:expr3 本身又是條件表達式。
#include <stdio.h>
int main(void) {
int a, b;
printf("輸入兩數: ");
scanf("%d%d", &a, &b);
printf("max=%d\n", a > b ? a : b);
return 0;
}
grade = (score >= 90) ? 'A' :
(score >= 60) ? 'B' : 'C';
右結合特性使此鏈式寫法正確運作,等價:
if (score >= 90) grade = 'A';
else if (score >= 60) grade = 'B';
else grade = 'C';
| 場景 | 建議 | 理由 |
|---|---|---|
| 簡單二選一賦值 | ✅ 推薦 | 簡潔、單表達式、無副作用 |
| 複雜邏輯/多語句 | ❌ 禁用 | 可讀性崩塌,改用 if-else |
| 函式參數/返回值 | ✅ 推薦 | 避免臨時變數,如 return a>b?a:b; |
| 深層巢狀 (>2 層) | ⚠️ 謹慎 | 難維護,考慮 switch 或查表 |
條件運算子是「表達式級的 if-else」,掌握右結合與優先級兩大核心規則,善用於簡單賦值與返回值,能讓代碼更緊湊、函數式風格更濃。濫用巢狀則會製造「寫時讀懂、改時淚流」的維護噩夢。