首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言運算符優先級與結合性完整速查表(含易錯點解析)

     編輯:關於C語言

運算符優先級表(高 → 低)

級別運算符名稱結合性備註
1[]數組下標左→右最高
()函數調用/分組
.結構體成員訪問
->指針訪問成員
2++ --後置自增/自減左→右單目
++ --前置自增/自減右→左單目
+ -正/負號
! ~邏輯非/按位取反
(type)強制類型轉換
*解引用
&取地址
sizeof類型/表達式大小
3* / %乘/除/取模左→右雙目
4+ -加/減左→右雙目
5<< >>左/右移左→右雙目
6< <= > >=關係運算左→右雙目
7== !=相等性判斷左→右雙目
8&按位與左→右雙目
9^按位異或左→右雙目
10|按位或左→右雙目
11&&邏輯與左→右短路
12||邏輯或左→右短路
13?:條件運算符右→左三目
14=賦值右→左賦值表達式
+= -= *= /= %=複合賦值
<<= >>=移位賦值
&= ^= |=位運算賦值
15,逗號運算符左→右順序求值

必須牢記的 3 個右結合級別

  1. 單目運算符(前置 `++`、`--`、`!`、`~`、`*`、`&`、`(type)`、`sizeof`)
  2. 條件運算符 `?:`
  3. 賦值運算符 `=` `+=` `-=` 等

其餘全部左結合。

經典易錯表達式解析

1. `a = b = c = 5`

右結合 → `a = (b = (c = 5))` → 依次賦值,最終 `a=b=c=5`。

2. `++a++` 編譯錯誤

後置 `++` 優先級高於前置 `++` → 解析為 `++(a++)`。`a++` 返回右值(非左值),無法前置 `++` → 錯誤。

3. `a > b ? c : d > e ? f : g`

條件運算符右結合 → `a > b ? c : (d > e ? f : g)`。建議加括號明確意圖。

4. `*p++` vs `(*p)++`

  • `*p++` → `*(p++)`:取值後指針後移(遍歷數組常用)
  • `(*p)++` → 指針指向的值加 1

5. `sizeof int * p`

`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

只有 4 個運算符規定了求值順序

  1. &&
  2. ||
  3. ?:
  4. ,(逗號運算符,非函數參數逗號)

其他雙目運算符(如 `+` `-` `*` `/`)不保證左右操作數求值順序,編譯器可自由調度。

快速記憶口訣

單目條件賦值右,其餘全都向左推。
括號最高逗號最低,短路邏輯順序有。
后置++優先前置後,指針解引用緊跟後。
sizeof屬於單目列,結合右邊不發愁。

總結

運算符優先級與結合性是 C 語言靜態語義的基石。建議:

  1. **複雜表達式必加括號**,消除歧義、提高可讀性
  2. 2. **熟記 3 個右結合級別**,其餘默認左結合 3. **利用短路特性** 編寫安全高效條件判斷 4. **避免依賴未規定求值順序** 的副作用表達式(如 `f() + g()` 中 `f` `g` 順序不定)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved