運算符優先級表(高 → 低)
| 級 | 運算符 | 名稱/含義 | 形式 | 結合性 | 說明 |
| 1 | [] | 數組下標 | arr[expr] | 左→右 | |
() | 函數調用/分組 | func(args) / (expr) | 左→右 | |
. | 成員訪問(對象) | obj.member | 左→右 | |
-> | 成員訪問(指針) | ptr->member | 左→右 | |
++ | 後置自增 | var++ | 左→右 | 單目 |
-- | 後置自減 | var-- | 左→右 | 單目 |
() | 類型轉換 | (type)expr | 右→左 | 單目 |
| 2 | ++ | 前置自增 | ++var | 右→左 | 單目 |
-- | 前置自減 | --var | 右→左 | 單目 |
* | 間接訪問 | *ptr | 右→左 | 單目 |
& | 取地址 | &var | 右→左 | 單目 |
+ | 正號 | +expr | 右→左 | 單目 |
- | 負號 | -expr | 右→左 | 單目 |
! | 邏輯非 | !expr | 右→左 | 單目 |
~ | 按位取反 | ~expr | 右→左 | 單目 |
sizeof | 大小 | sizeof(expr) | 右→左 | 單目 |
| 3 | * | 乘法 | a * b | 左→右 | 雙目 |
/ | 除法 | a / b | 左→右 | 雙目 |
% | 取模 | a % b | 左→右 | 雙目 |
| 4 | + | 加法 | a + b | 左→右 | 雙目 |
- | 減法 | a - b | 左→右 | 雙目 |
| 5 | << | 左移 | a << b | 左→右 | 雙目 |
>> | 右移 | a >> b | 左→右 | 雙目 |
| 6 | < | 小於 | a < b | 左→右 | 雙目 |
<= | 小於等於 | a <= b | 左→右 | 雙目 |
> | 大於 | a > b | 左→右 | 雙目 |
>= | 大於等於 | a >= b | 左→右 | 雙目 |
| 7 | == | 等於 | a == b | 左→右 | 雙目 |
!= | 不等於 | a != b | 左→右 | 雙目 |
| 8 | & | 按位與 | a & b | 左→右 | 雙目 |
| 9 | ^ | 按位異或 | a ^ b | 左→右 | 雙目 |
| 10 | | | 按位或 | a | b | 左→右 | 雙目 |
| 11 | && | 邏輯與 | a && b | 左→右 | 短路 |
| 12 | || | 邏輯或 | a || b | 左→右 | 短路 |
| 13 | ?: | 條件運算符 | a ? b : c | 右→左 | 三目 |
| 14 | = | 賦值 | a = b | 右→左 | |
+= -= *= /= %= | 複合賦值 | a += b | 右→左 | |
<<= >>= &= ^= |= | 位運算賦值 | a &= b | 右→左 | |
| 15 | , | 逗號運算符 | a, b, c | 左→右 | 順序求值 |
常見優先級陷阱速記
- 後置 ++/-- 高於前置:
a = b++ 先賦值再增;a = ++b 先增再賦值。
- 單目運算符右結合:
*p++ 等價 *(p++);++*p 等價 ++(*p)。
- 位運算優先級低於關係運算:
a & b == c 實為 a & (b == c),通常需加括號 (a & b) == c。
- 邏輯與高於邏輯或:
a || b && c 等價 a || (b && c)。
- 條件運算符右結合:
a ? b : c ? d : e 等價 a ? b : (c ? d : e)。
- 賦值最低(逗號除外):
a = b = c 等價 a = (b = c)。
最佳實踐
- 不確定時加括號,犧牲簡潔換取可讀與正確。
- 啟用編譯器警告
-Wparentheses 捕獲可疑優先級。
- 複雜表達式拆分為多行中間變量,便於調試與維護。
口訣
單目 乘除加減 移位 關係 相等 位與 位異或 位或 邏輯與 邏輯或 三目 賦值 逗號
1 2 3 4 5 6 7 8 9 10 11 12 13