| 運算符 | 名稱 | 語義 | 優先級 |
|---|---|---|---|
| ! | 邏輯非 | 真變假,假變真 | 最高(單目) |
| && | 邏輯與 | 雙真才真,否則假 | 中 |
| || | 邏輯或 | 雙假才假,否則真 | 低 |
A B !A A&&B A||B 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 1 0 1 1
C語言中:0 代表假,非 0 代表真。運算結果只產生 0 或 1。
A && B:若 A 為假(0),不計算 B,直接返回 0A || B:若 A 為真(非0),不計算 B,直接返回 1// 1. 防止空指標解引用
if (ptr != NULL && ptr->value > 0) { ... }
// 2. 條件執行副作用函數
if (init() && process() && cleanup()) { success(); }
// 3. 範圍檢查(注意優先級)
if (0 <= x && x < 100) { ... } // 正確
// if (0 <= x < 100) 錯誤!等價於 (0 <= x) < 100 永真
a+b>c && b==c 分析只有當 a+b>c 為真(非0)且 b==c 為真時,整個表達式值為 1。其他三種組合(真假、假真、假假)結果均為 0。這正是「短路與」的語義:前假則不評估後項。
// 關係運算符 > == 優先於邏輯運算符
a + b > c && b == c
// 等價於
((a + b) > c) && (b == c)
但邏輯運算符優先級低於賦值運算符 =,故:
int flag = a > b && c < d; // 正確:邏輯運算先算,結果賦值
// 但
int flag;
flag = a > b && c < d; // 正確
flag = a > b && c < d; // 正確
// 若寫成
if (flag = a > b && c < d) // 警告:賦值在條件中,建議加括號