C 語言中 ? 只出現在三元運算符 ? : 中,無獨立含義。語法:condition ? expr1 : expr2。
// 基本形式
int max = (a > b) ? a : b;
// 等價 if-else
int max;
if (a > b) max = a;
else max = b;
| 特性 | 說明 |
|---|---|
| 運算元 | 三個(唯一三元運算符) |
| 結合性 | 右結合 |
| 求值順序 | 先算 condition,真取 expr1,假取 expr2(短路) |
| 類型 | expr1 和 expr2 需兼容,結果類型按常規轉換規則確定 |
| 左值性 | C++ 中可作左值((cond ? a : b) = 10;),C 中不是左值 |
int abs = (x >= 0) ? x : -x;
int min = (a < b) ? a : b;
const char* status = (code == 0) ? "OK" : "ERROR";
int sign = (x > 0) ? 1 : ((x < 0) ? -1 : 0);
// 等價
int sign;
if (x > 0) sign = 1;
else if (x < 0) sign = -1;
else sign = 0;
printf("%s\n", (age >= 18) ? "Adult" : "Minor");
return (ptr != NULL) ? ptr->value : DEFAULT_VAL;
// ❌ 危險:i 可能自增兩次或零次
int val = (cond) ? i++ : i++;
// ✅ 安全:分離副作用
if (cond) val = i++;
else val = i++;
// 優先級:? : 低於 算術/關係/邏輯運算符,高於 賦值/逗號
int a = 1, b = 2, c = 3;
int x = a > b ? a : b + c; // 等價 a > b ? a : (b + c)
// 右結合:a ? b : c ? d : e 等價 a ? b : (c ? d : e)
// 建議:複雜嵌套加括號
int y = a ? b : (c ? d : e);
// GCC/Clang 支持:x ? : y 等價 x ? x : y
int val = get_value() ? : default_val; // 非標準,可移植代碼避免使用
| 特性 | C | C++ |
|---|---|---|
| 結果類型 | 常規轉換 | 更複雜的公共類型推導 |
| 左值性 | 非左值 | 可為左值(若兩操作數均為同類型左值) |
| 類型推導 | 無 auto | 支持 auto 推導 |
(cond) ? (expr1) : (expr2)C 語言 ? 唯一身份是三元運算符 ? : 的一部分。掌握其短路求值、右結合、類型轉換、優先級特性,用於簡單條件賦值/返回,複雜邏輯堅持用 if-else。切記:三元運算符是表達式,不是語句,這是它與 if-else 最大的本質區別。