關係運算符是程序決策的基石,構成 if、while、for 等控制流的判斷條件。本文系統梳理六大關係運算符的優先級規則、表達式求值機制、類型轉換陷阱與最佳實踐,助你寫出無歧義、高可讀性的條件判斷代碼。
| 運算符 | 含義 | 示例 | 結果 (a=5,b=3) |
|---|---|---|---|
< | 小於 | a < b | 0 (假) |
<= | 小於等於 | a <= b | 0 |
> | 大於 | a > b | 1 (真) |
>= | 大於等於 | a >= b | 1 |
== | 等於 | a == b | 0 |
!= | 不等於 | a != b | 1 |
1. 算術運算符 (+, -, *, /, %)
2. 關係運算符 (<, <=, >, >=) ← 最高
3. 關係運算符 (==, !=) ← 次高
4. 邏輯運算符 (!, &&, ||)
5. 條件運算符 (?:)
6. 賦值運算符 (=, +=, -=...)
7. 逗號運算符 (,)
核心結論:算術 > 關係 > 賦值。a + b > c - d等價於(a + b) > (c - d),無需額外括號。
a < b < c // 等價於 (a < b) < c ⚠️ 邏輯陷阱!
// 正確寫法:a < b && b < c
1 (真)、0 (假)int x = (a > b) + (c == d); // 結果 0, 1, 2<stdbool.h> 引入 bool、true、false,本質仍是整數'a' < 'b' // 比較 ASCII 碼:97 < 98 → 1 (真)
'A' > 'a' // 65 > 97 → 0 (假)
unsigned int u = 10;
int i = -1;
u > i // 真!因為 i 隱式轉換為無符號巨大值 (4294967295)
// 編譯器警告:comparison between signed and unsigned
// 修正:static_cast<int>(u) > i 或 (int)u > i
float x = 0.1f;
float y = 0.3f - 0.2f; // 非精確 0.1
x == y // 可能為 0 (假)!
// 正確:epsilon 比較
const float EPS = 1e-6;
fabs(x - y) < EPS
a > (b > c) // 先算 b>c 得 0/1,再與 a 比較
// 等價於 a > (b > c ? 1 : 0)
// 幾無實際用途,極易誤讀
// 區間判斷
if (0 <= x && x < 100) // ✅ 清楚表達 0 ≤ x < 100
if (x >= 0 && x < 100) // 同義
// 多條件組合
if ((score >= 60 && score < 90) || bonus) // 及格或有加分
if (age >= 18 && (has_id || has_passport)) // 成年且有證件
int a = 5, b = 3, c = 7;
int result = a < b < c; // 結果 = 1 (真) ❌ 非預期!
// 步驟:(5 < 3) → 0,然後 0 < 7 → 1
// 正確:a < b && b < c
if (x = 5) // 警告:assignment used as truth value
// 等價於 x=5,表達式值 5 (真)
// 正確:if (x == 5)
for (float f = 0.0f; f != 1.0f; f += 0.1f) // 可能無限循環!
// 0.1 二進制無法精確表示,累積誤差導致 f 永遠 ≠ 1.0
// 正確:for (int i = 0; i <= 10; i++) { float f = i * 0.1f; }
&& 連接雙邊比較(a + b) > (c * d) 雖可省略但加上更清晰if (5 == x) 寫錯成 = 會編譯報錯if (isValidUser(user) && hasPermission(user, res))-Wall -Wextra -Wparentheses -Wsign-comparestd::rel_ops (C++20 棄用):定義 operator> 等自動生成其它關係運算符<=> (C++20):auto cmp = a <=> b; 返回 std::strong_orderingstd::cmp_equal, std::cmp_less (C++20):安全比較有符號/無符號整數關係運算符雖簡單,但優先級層級、左結合性、整數提升規則、有符號無符號轉換、浮點精度等細節決定了條件判斷的正確性。遵循「顯式括號、拒絕鏈式、慎用浮點相等、統一符號性」原則,配合現代 C++ <=> 與 std::cmp_* 工具,能構建健壯、可維護的決策邏輯。