C語言運算符完整分類與優先級速查表
運算符是表達式的構建塊。本文按功能分類匯總所有 C 運算符,附帶優先級與結合性表,方便編寫複雜表達式時快速查閱。
按功能分類
1. 算術運算符
| 符號 | 名稱 | 示例 |
| + | 加 | a + b |
| - | 減 | a - b |
| * | 乘 | a * b |
| / | 除 | a / b |
| % | 取模 | a % b |
| ++ | 前/後置遞增 | ++a / a++ |
| -- | 前/後置遞減 | --a / a-- |
2. 關係運算符
| 符號 | 含義 |
| == | 相等 |
| != | 不等 |
| > | 大於 |
| < | 小於 |
| >= | 大於等於 |
| <= | 小於等於 |
3. 邏輯運算符
| 符號 | 名稱 | 短路求值 |
| && | 邏輯與 | 左側為假則不算右側 |
| || | 邏輯或 | 左側為真則不算右側 |
| ! | 邏輯非 | 單目 |
4. 位運算符
| 符號 | 名稱 | 示例 |
| & | 按位與 | a & b |
| | | 按位或 | a | b |
| ^ | 按位異或 | a ^ b |
| ~ | 按位取反 | ~a |
| << | 左移 | a << 2 |
| >> | 右移 | a >> 2 |
5. 賦值運算符
| 符號 | 等價展開 |
| = | a = b |
| += | a = a + b |
| -= | a = a - b |
| *= | a = a * b |
| /= | a = a / b |
| %= | a = a % b |
| <<= | a = a << b |
| >>= | a = a >> b |
| &= | a = a & b |
| ^= | a = a ^ b |
| |= | a = a | b |
6. 其他運算符
| 符號 | 名稱/功能 |
| ?: | 條件運算符 (三目) |
| , | 逗號運算符 (順序求值,取最後值) |
| & | 取地址 |
| * | 解引用 |
| sizeof | 類型/表達式大小 (編譯期) |
| (type) | 強制類型轉換 |
| [] | 數組下標 |
| . | 結構體成員訪問 (實體) |
| -> | 結構體成員訪問 (指針) |
優先級與結合性表 (高 → 低)
| 優先級 | 運算符 | 結合性 |
| 1 | () [] -> . sizeof (type) ++ -- (後置) | 左→右 |
| 2 | ++ -- + - ! ~ * & (type) sizeof (前置/單目) | 右→左 |
| 3 | * / % | 左→右 |
| 4 | + - | 左→右 |
| 5 | << >> | 左→右 |
| 6 | < > <= >= | 左→右 |
| 7 | == != | 左→右 |
| 8 | & | 左→右 |
| 9 | ^ | 左→右 |
| 10 | | | 左→右 |
| 11 | && | 左→右 |
| 12 | || | 左→右 |
| 13 | ?: | 右→左 |
| 14 | = += -= *= /= %= <<= >>= &= ^= |= | 右→左 |
| 15 | , | 左→右 |
常見優先級陷阱
// 1. sizeof 不是函數
sizeof int x; // 錯誤
sizeof(int) * x; // 正確
// 2. 條件運算符結合性
a ? b : c ? d : e // 等價 a ? b : (c ? d : e)
// 3. 位運算優先級低於關係
if (a & b == c) // 等價 a & (b == c) ❌
if ((a & b) == c) // 正確 ✅
// 4. 賦值表達式有值
while ((c = getchar()) != EOF) // 正確利用賦值表達式的值
最佳實踐
- 複雜表達式加括號:寧可多打幾個括號,也不依賴記憶優先級;
- 避免副作用疊加:
a[i++] = i++ 行為未定義;
- 短路求值善用:
if (p && p->next) 先判空再解引用;
- sizeof 操作數不求值:
sizeof(i++) 不會改變 i。
將此表收藏,編寫、審查、調試表達式時隨時對照,能消除 90% 的運算符相關 Bug。