// 1. 單分支
if (表達式) 語句;
// 2. 雙分支
if (表達式) 語句1; else 語句2;
// 3. 多重分支 (梯次 if-else if)
if (expr1) stmt1;
else if (expr2) stmt2;
else if (expr3) stmt3;
else stmt_default;
// 4. 複合語句 (塊) - 強烈建議永遠用大括號 {}
if (expr) {
stmt1;
stmt2;
} else {
stmt3;
}
| 運算子 | 名稱 | 短路求值 | 優先級 | 典型用法 |
|---|---|---|---|---|
| `&&` | 邏輯與 | **是** (左真才算右) | 低 | `if (p && *p == 0)` 安全檢查指針 |
| `||` | 邏輯或 | **是** (左假才算右) | 低 | `if (!p || *p == 0)` |
| `!` | 邏輯非 | 單目 | 高 | `if (!flag)` |
| `&` | 位元與 | **否** (雙邊必算) | 中 | 位掩碼 `if (flags & MASK)` |
| `|` | 位元或 | **否** | 低 | 位合併 |
短路特性應用**:`if (ptr != NULL && ptr->len > 0)` 保證不解引用空指針。`||` 用於預設值 `val = get_val() || default_val;` (C 無此語法,需三元)。
int a = 1, b = 2;
if (a > 0 & b > 0) // 位元與:兩邊都算,結果 1 & 1 = 1 (真)
// 若 b 為函數調用有副作用,& 會強制執行,&& 則可能跳過
// 邏輯判斷**永遠用 && ||**,除非明確需要位運算且無副作用
// 語法: 條件 ? 真值 : 假值
// 為表達式,有值,可賦值/傳參/返回
int max = (a > b) ? a : b;
int abs = (x >= 0) ? x : -x;
// 巢狀三元 (可讀性差,慎用)
int sign = (x > 0) ? 1 : ((x < 0) ? -1 : 0);
// 類型兼容:真/假分支類型需兼容 ( usual arithmetic conversions )
// 錯誤: (cond) ? 1 : "str" // int vs char* 不兼容
// 多層嵌套 -> 箭頭型代碼 (難讀)
if (a) {
if (b) {
if (c) { do_it(); }
}
}
// 改進 1: 衛語句 / 提前返回
if (!a) return;
if (!b) return;
if (!c) return;
do_it();
// 改進 2: 邏輯合併
if (a && b && c) do_it();
// 改進 3: 狀態機 / 表驅動 (複雜邏輯)
if (a)
if (b) foo();
else bar(); // else 匹配最近的未配對 if (即 if(b))
// 等價:
if (a) {
if (b) foo();
else bar(); // 視覺誤導!
}
// 解決:永遠用 {} 包裹複合語句
`if` 是流程控制基石。掌握「短路邏輯運算子」、「三元運算子表達式屬性」、「衛語句扁平化嵌套」、「運算子優先級陷阱」,並配合靜態分析工具,能寫出清晰、安全、高效的條件判斷代碼。