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

C 語言運算符與表達式完整指南:優先級、結合性與類型詳解

     編輯:關於C語言

運算符分類總覽(10 大類)

類別運算符說明
算術+ - * / % ++ --數值運算
關系> < == >= <= !=比較運算
邏輯&& || !布林邏輯
位操作& | ^ ~ << >>位元級運算
賦值= += -= *= /= %= &= |= ^= <<= >>=11 種複合賦值
條件?:三元運算符
逗號,順序求值
指標* &解引用/取址
sizeofsizeof類型/運算元大小
特殊() [] -> .函數調用/下標/成員存取

優先級與結合性完整表(高到低,共 15 級)

優先級運算符結合性說明
1() [] -> .左→右主要運算符
2! ~ ++ -- + - * & sizeof (type)右→左一元運算符
3* / %左→右乘除模
4+ -左→右加減
5<< >>左→右移位
6< <= > >=左→右關系
7== !=左→右相等性
8&左→右位與
9^左→右位異或
10|左→右位或
11&&左→右邏輯與
12||左→右邏輯或
13?:右→左條件
14= += -= ...右→左賦值
15,左→右逗號

關鍵結合性規則

  • 左結合:`a - b - c` 等價 `(a - b) - c`
  • 右結合:`a = b = c` 等價 `a = (b = c)`;`a ? b : c ? d : e` 等價 `a ? b : (c ? d : e)`
  • 一元運算符、賦值、條件、sizeof 為右結合

算術運算符細節

除法 `/` 與取模 `%`

  • 整數除法:截斷向零(C99 標準),如 `5/2=2`, `-5/2=-2`
  • 取模:`a % b` 與 `a / b` 滿足 `a = (a/b)*b + a%b`
  • 負數取模:`-5 % 2 = -1`(C99),符號同被除數

自增/自減

  • 前綴 `++i`:先增後用,回傳新值
  • 後綴 `i++`:先用後增,回傳舊值
  • 副作用順序點:同一表達式多次修改同一變量為未定義行為(如 `i = i++`)

位操作運算符實戰


// 設置第 n 位
x |= (1 << n);

// 清除第 n 位
x &= ~(1 << n);

// 翻轉第 n 位
x ^= (1 << n);

// 檢查第 n 位
if (x & (1 << n)) ...

// 取低 n 位
x & ((1 << n) - 1)

// 乘以 2^n
x << n

// 除以 2^n(無號/正數)
x >> n

注意:有號數右移為實現定義(算術右移保留符號位 / 邏輯右移補 0),跨平台請用無號數。

常見陷阱案例

1. 條件運算符優先級


int a = 1, b = 2, c = 3;
int x = a > b ? a : b > c ? b : c; // 等價 a>b ? a : (b>c ? b : c)

2. 逗號運算符 vs 函數參數


func(a, b, c);     // 3 個參數
func((a, b), c);   // 2 個參數,(a,b) 求值為 b

3. sizeof 運算元不求值


int i = 0;
sizeof(i++); // i 仍為 0

4. 邏輯運算符短路求值


if (p != NULL && p->val > 0) ... // 安全:p 為 NULL 時不解引用
if (p->val > 0 || p == NULL) ... // 危險:可能先求 p->val

最佳實踐建議

  1. 複雜表達式加括號明確意圖,不依賴記憶優先級
  2. 避免同一表達式多次副作用(`i++ + i++`)
  3. 位操作優先使用無號整數
  4. 善用短路求值簡化條件判斷
  5. 啟用 `-Wparentheses` 警告捕捉潛在優先級誤解

總結

C 運算符豐富強大,但優先級與結合性規則複雜。掌握核心表格、理解結合性方向、警惕副作用與未定義行為,是寫出正確、可維護 C 代碼的基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved