| 構造 | 類別 | 有值 | 可嵌套 | 典型用途 |
|---|---|---|---|---|
cond ? expr1 : expr2 | 表達式 | 是 | 是 | 初始化、返回值、函數參數 |
if (cond) stmt1; else stmt2; | 語句 | 否 | 是 (塊) | 流程控制、副作用操作 |
// 1. 返回賦值表達式的值 (左值)
int a=1, b=2, c;
c = (a > b ? a : b) = 100; // 將較大者設為 100
// 2. 避免重複計算
printf("%d\n", (x = foo()) > 0 ? x : -x); // foo() 只調用一次
// 3. 指針選擇
int *p = flag ? &a : &b;
*p = 20; // 修改 a 或 b
void swap_bad(int a, int b) { // 複製品交換,無效
int t = a; a = b; b = t;
}
void swap_good(int *a, int *b) { // 傳遞地址,修改原對象
int t = *a; *a = *b; *b = t;
}
int main() {
int x=1, y=2;
swap_bad(x, y); // x,y 不變
swap_good(&x, &y); // x=2, y=1
return 0;
}
C 無「返回語句」概念。**表達式有值**,**語句無值**。若需在條件分支執行複雜邏輯,**必須用 if-else 塊**,或將邏輯封裝為函數返回值。
// 錯誤想法:cond ? (a=b+c) : (a=b*c); // 只是表達式,可賦值
// 正確:if (cond) a = b + c; else a = b * c;