| 運算符 | 名稱 | 目數 | 數學對應 | 結合性 |
| && | 邏輯與 | 雙目 | 且 (∧) | 左結合 |
| || | 邏輯或 | 雙目 | 或 (∨) | 左結合 |
| ! | 邏輯非 | 單目 | 非 (¬) | 右結合 |
真值判定規則
- 0 為假,非 0 為真
- 邏輯運算結果:真 → 1,假 → 0
三大運算符真值表
&& (與):全真才真
5 && 0 → 0 (真與假=假)
(5>0) && (4>2) → 1 && 1 → 1
|| (或):一真即真
10 || 0 → 1 (真或假=真)
(5>0) || (5>8) → 1 || 0 → 1
! (非):真假互換
!0 → 1
!(5>0) → !1 → 0
短路求值(關鍵特性)
&&:左側為假 → 右側不計算(結果必假)
||:左側為真 → 右側不計算(結果必真)
實戰意義
// 避免空指針解引用
if (ptr != NULL && ptr->value > 0) { ... }
// 避免除零
if (b != 0 && a / b > 10) { ... }
優先級(從低到高)
賦值 (=) < &&/|| < 關系運算符 < 算術運算符 < !
等價加括號示例
a>b && c>d ≡ (a>b) && (c>d)
!b==c || d ≡ ((!b)==c) || (d
a+b>c && x+y ≡ ((a+b)>c) && ((x+y)
嵌套邏輯表達式
a > b && b || 9 > c
a || c > d && !p
綜合示例輸出
#include <stdio.h>
int main() {
char c='k'; int i=1,j=2,k=3; float x=3e+5,y=0.85;
printf("%d,%d\n", !x*!y, !!!x); // 0,0
printf("%d,%d\n", x||i&&j-3, i
運行結果解析
0,0
1,0
0,1
!x 和 !y 均為 0(x,y 非零),乘積 0
!!!x = !!0 = !1 = 0
j-3=-1 非零,i&&-1 = 1,x||1 = 1
i 為 1,x 為 0,1&&0 = 0
i==5 為 0,0&&... 短路,j=8 不執行
x+y 非零,非零||... 短路,結果 1
工程最佳實踐
- 利用短路求值保護危險操作(指針、除法、數組越界)
- 複雜條件加括號明確優先級,提高可讀性
- 避免在邏輯表達式中放副作用操作(除非刻意利用短路)
- 條件判斷優先寫最可能短路的表達式在左側
- 上一篇文章: C語言 switch 語句:多條件分支、break 跳出機制、case 標籤規則與實戰
- 下一篇文章: C語言關系運算符:六大運算符、優先級、結果值與 if 判斷條件深度解析
Copyright ©
程式碼之家 All Rights Reserved