| 級別 | 運算符 | 名稱 | 結合性 | 備註 |
|---|---|---|---|---|
| 1 | [] | 數組下標 | 左→右 | 最高 |
() | 函數調用/分組 | |||
. | 結構體成員訪問 | |||
-> | 指針訪問成員 | |||
| 2 | ++ -- | 後置自增/自減 | 左→右 | 單目 |
++ -- | 前置自增/自減 | 右→左 | 單目 | |
+ - | 正/負號 | |||
! ~ | 邏輯非/按位取反 | |||
(type) | 強制類型轉換 | |||
* | 解引用 | |||
& | 取地址 | |||
sizeof | 類型/表達式大小 | |||
| 3 | * / % | 乘/除/取模 | 左→右 | 雙目 |
| 4 | + - | 加/減 | 左→右 | 雙目 |
| 5 | << >> | 左/右移 | 左→右 | 雙目 |
| 6 | < <= > >= | 關係運算 | 左→右 | 雙目 |
| 7 | == != | 相等性判斷 | 左→右 | 雙目 |
| 8 | & | 按位與 | 左→右 | 雙目 |
| 9 | ^ | 按位異或 | 左→右 | 雙目 |
| 10 | | | 按位或 | 左→右 | 雙目 |
| 11 | && | 邏輯與 | 左→右 | 短路 |
| 12 | || | 邏輯或 | 左→右 | 短路 |
| 13 | ?: | 條件運算符 | 右→左 | 三目 |
| 14 | = | 賦值 | 右→左 | 賦值表達式 |
+= -= *= /= %= | 複合賦值 | |||
<<= >>= | 移位賦值 | |||
&= ^= |= | 位運算賦值 | |||
| 15 | , | 逗號運算符 | 左→右 | 順序求值 |
其餘全部左結合。
右結合 → `a = (b = (c = 5))` → 依次賦值,最終 `a=b=c=5`。
後置 `++` 優先級高於前置 `++` → 解析為 `++(a++)`。`a++` 返回右值(非左值),無法前置 `++` → 錯誤。
條件運算符右結合 → `a > b ? c : (d > e ? f : g)`。建議加括號明確意圖。
`sizeof` 是單目運算符,右結合 → `sizeof (int * p)` 即 `sizeof(int*)`(指針大小)。若想求 `int` 大小,寫 `sizeof(int)` 或 `sizeof *p`。
&&:左邊為假(0)→ 右邊**不計算**||:左邊為真(非 0)→ 右邊**不計算**?::只計算條件為真/假對應的那一支int a = 0, b = 10; if (a && (b = 20)) // b 不會被賦值 20 if (a || (b = 20)) // b 會被賦值 20
&&||?:,(逗號運算符,非函數參數逗號)其他雙目運算符(如 `+` `-` `*` `/`)不保證左右操作數求值順序,編譯器可自由調度。
單目條件賦值右,其餘全都向左推。
括號最高逗號最低,短路邏輯順序有。
后置++優先前置後,指針解引用緊跟後。
sizeof屬於單目列,結合右邊不發愁。
運算符優先級與結合性是 C 語言靜態語義的基石。建議: