優先級與結合性
| 運算子 | 優先級 | 結合性 | 說明 |
< <= > >= | 第 6 級(較高) | 左結合 | 關係運算子 |
== != | 第 7 級(略低於關係) | 左結合 | 相等性運算子 |
&& | 第 11 級 | 左結合 | 邏輯 AND |
|| | 第 12 級 | 左結合 | 邏輯 OR |
?: | 第 13 級 | 右結合 | 條件運算子 |
= += 等 | 第 14 級(最低) | 右結合 | 賦值運算子 |
結論:< <= > >= 優先級 高於 == !=。同組內優先級相同,左結合。
運算子語意詳細解析
| 運算子 | 名稱 | 真值條件 | 範例 | 結果 |
== | 等於 | 左運算元等於右運算元 | 5 == 5 | 1 (真) |
!= | 不等於 | 左運算元不等於右運算元 | 5 != 3 | 1 (真) |
< | 小於 | 左運算元小於右運算元 | 3 < 5 | 1 (真) |
<= | 小於或等於 | 左運算元小於或等於右運算元 | 5 <= 5 | 1 (真) |
> | 大於 | 左運算元大於右運算元 | 5 > 3 | 1 (真) |
>= | 大於或等於 | 左運算元大於或等於右運算元 | 5 >= 5 | 1 (真) |
關鍵概念:C 語言的「真」與「假」
- 零 (0) 為假,非零為真。
- 關係/相等/邏輯運算子的結果型別為
int,值只能是 1 (真) 或 0 (假)。
if (x == 5) 中,x == 5 的值是 1 或 0,if 判斷該值是否非零。
常見誤區與陷阱
| 誤區代碼 | 問題 | 正確理解 |
if (a = 5) | 賦值而非比較,值為 5 (真),永遠執行 | 比較用 ==,編譯器 -Wall 會警告 |
if (0 < x < 10) | 左結合:(0 < x) < 10,0 結果 0/1,永遠 < 10 為真 | 寫 if (0 < x && x < 10) |
if (x == 1 || 2) | 解析為 (x == 1) || 2,2 為真,永遠執行 | 寫 if (x == 1 || x == 2) |
浮點數直接 == | 精度誤差導致邏輯錯誤 | 用 fabs(a-b) < EPSILON |
sizeof(x) == 4 判斷 int | 不可移植,int 可能 2/4/8 位元組 | 用 sizeof(int) 或 <stdint.h> 固定寬度型別 |
運算子組合實例
// 範例:判斷年份是否為閏年
// 規則:能被 4 整除但不能被 100 整除,或能被 400 整除
int is_leap(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
// 優先級:% > == != > && > ||,無需額外括號
}
// 範例:分數等級判斷
char grade(int score) {
if (score >= 90) return 'A';
else if (score >= 80) return 'B';
else if (score >= 70) return 'C';
else if (score >= 60) return 'D';
else return 'F';
// 利用短路求值與優先級,依序判斷
}
標準庫替代:<stdbool.h> (C99)
#include <stdbool.h>
bool is_equal(int a, int b) {
return a == b; // 返回 true/false,可讀性更高
}
if (is_equal(x, y)) { ... } // 直接用 bool 變數
雖然底層仍是 int,但 bool、true、false 關鍵字讓意圖更清晰。
總結
< <= > >= 優先級高於 == !=,同組左結合。
== 判斷「等於」,!= 判斷「不等於」,結果為 int (1/0)。
- C 語言以 零為假、非零為真,運算子結果嚴格為 1/0。
- 避開經典陷阱:
= vs ==、鏈式比較、浮點數相等、短路求值順序。