首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言 if 語句完全指南:條件判斷、邏輯運算子、三元運算子、嵌套與簡化技巧

     編輯:關於C語言

基本語法形式


// 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 (ptr)` 等價 `if (ptr != NULL)`;`if (val)` 等價 `if (val != 0)`。
  • 浮點數比較見前文陷阱 (避免 `==`)。

邏輯運算子詳解

運算子名稱短路求值優先級典型用法
`&&`邏輯與**是** (左真才算右)低`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: 狀態機 / 表驅動 (複雜邏輯)

懸空 else 問題


if (a)
    if (b) foo();
else bar(); // else 匹配最近的未配對 if (即 if(b))
// 等價:
if (a) {
    if (b) foo();
    else bar(); // 視覺誤導!
}
// 解決:永遠用 {} 包裹複合語句

常見陷阱總結

  1. `=` vs `==`**:`if (x = 1)` 永真 (賦值返回 1)。現代編譯器 `-Wparentheses` 警告,寫成 `if (1 == x)` (Yoda 條件) 或啟用 `-Werror`。
  2. 浮點數 `==`**:見類型陷阱文。
  3. 整數除法截斷**:`if (3/2 == 1.5)` 假 (3/2=1)。
  4. 運算子優先級**:`if (a & MASK == 0)` 解析為 `a & (MASK == 0)` → `a & 0` → 0。正確:`if ((a & MASK) == 0)`。
  5. 副作用依賴短路**:`if (func1() || func2())` 若 `func1` 真 `func2` 不執行。若 `func2` 有必要副作用 (如釋放鎖) → Bug。

總結

`if` 是流程控制基石。掌握「短路邏輯運算子」、「三元運算子表達式屬性」、「衛語句扁平化嵌套」、「運算子優先級陷阱」,並配合靜態分析工具,能寫出清晰、安全、高效的條件判斷代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved