在程式設計中,比較兩個數值的大小關係是最基礎也是最頻繁的操作。C語言提供了六種關係運算符,構成了條件判斷、循環控制等核心邏輯的基石。本文將系統講解關係運算符的優先級、結合性、表達式求值規則及實戰技巧。
| 運算符 | 含義 | 範例 | 結果(假設 a=5, b=3) |
|---|---|---|---|
< | 小於 | a < b | 0 (假) |
<= | 小於或等於 | a <= b | 0 (假) |
> | 大於 | a > b | 1 (真) |
>= | 大於或等於 | a >= b | 1 (真) |
== | 等於 | a == b | 0 (假) |
!= | 不等於 | a != b | 1 (真) |
<, <=, >, >=) — 優先級較高==, !=) — 優先級較低&&, ||)=)所有關係運算符均為雙目運算符,且具有左結合性(從左向右結合)。
關係表達式的值只有兩種:1 (真) 或 0 (假)。
5 > 0 // 值為 1 (真)
3 > 5 // 值為 0 (假)
'a' + 1 < 'c' // 字符按 ASCII 碼參與運算:97+1=98 < 99 → 1 (真)
由於表達式本身可以是關係表達式,允許嵌套:
a > (b > c) // 先算 b>c 得 0/1,再與 a 比較
a != (c == d) // 先算 c==d 得 0/1,再與 a 比較
- #include <stdio.h>
- int main(void){
- char c='k'; // ASCII 107
- int i=1, j=2, k=3;
- float x=3e+5, y=0.85;
- printf( "%d,%d\n", 'a'+5<c, -i-2*j>=k+1 );
- printf( "%d,%d\n", 1<j<5, x-5.25<=x+y );
- printf( "%d,%d\n", i+j+k==-2*j, k==j==i+5 );
- return 0;
- }
'a'+5<c, -i-2*j>=k+1'a'+5<c:'a'(97)+5=102 < 'k'(107) → 1 (真)-i-2*j>=k+1:-1-2*2=-5 >= 3+1=4 → -5 >= 4 為假 → 0 (假)1<j<5, x-5.25<=x+y1<j<5 ≠ 數學意義上的 1<j<5
1<j → 1<2 → 1 (真)1<5 → 1<5 → 1 (真)x-5.25<=x+y:3e+5-5.25 <= 3e+5+0.85 → 總是真 → 1i+j+k==-2*j, k==j==i+5i+j+k==-2*j:1+2+3=6 == -4 → 0 (假)k==j==i+5
k==j → 3==2 → 0 (假)0==i+5 → 0==6 → 0 (假)// 錯誤寫法:想判斷 1 < x < 10
if (1 < x < 10) // 永遠為真!因為 (1
if (a = 5) // 賦值,永遠為真(假設 5 非 0)
if (a == 5) // 比較,正確
float x = 0.1 + 0.2;
if (x == 0.3) // 危險!浮點數精度問題可能導致假
// 建議:使用誤差範圍比較
if (fabs(x - 0.3) < 1e-6)
(a > b) && (c < d) 比 a > b && c < d 更清晰-Wall -Wextra 捕捉 =/== 混淆關係運算雖然基礎,但其優先級層級(< <= > >= 高於 == !=)、左結合性導致的鏈式比較陷阱、以及浮點數比較的精度問題,都是初學者甚至資深開發者容易踩坑的地方。牢記「關係表達式值只有 0 和 1」,並養成「複雜條件加括號、鏈式比較用 &&」的習慣,能避免 90% 的邏輯錯誤。