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

《C和指針》讀書筆記第5章:運算符優先級、結合性與表達式求值

     編輯:關於C語言

章節核心:運算符優先級表與求值順序

第 5 章系統梳理 C 運算符優先級(高→低)、結合性,並強調副作用、序列點與未定義行為的關鍵區別。

運算符優先級速查(節選高頻)

優先級運算符結合性說明
1() [] -> .左→右函數調用、數組下標、結構體成員
2++ -- + - ! ~ * & (type) sizeof右→左一元運算符
3* / %左→右乘除模
4+ -左→右加減
5<< >>左→右移位
6< <= > >=左→右關係
7== !=左→右相等性
8&左→右按位與
9^左→右按位異或
10|左→右按位或
11&&左→右邏輯與(短路)
12||左→右邏輯或(短路)
13?:右→左條件運算符
14= += -= *= ...右→左賦值
15,左→右逗號運算符

關鍵概念

  • 副作用:修改對象狀態(賦值、自增、函數調用 I/O)
  • 序列點:保證副作用完成的時間點(語句結尾 ;、&&/||/?:/,、函數調用前後)
  • 未定義行為 (UB):同一序列點內對同一對象多次修改、或修改後讀取(非為了計算新值)
    例:a = a++;、printf("%d %d", i++, i);、*p++ = *q++;(此處合法,因修改不同對象)
  • 未指定行為:函數參數求值順序、a() + b() 中 a/b 調用順序

指針算術運算

  • p + n:地址增加 n * sizeof(*p) 位組
  • p - q:返回元素個數差(ptrdiff_t),要求指向同一數組
  • 指針比較:== != < > <= >=,同一數組內比較位置

經典面試陷阱

int a = 5;
printf("%d %d %d\n", a++, ++a, a); // UB:參數求值順序未指定,且 a 多次修改
// 正確寫法:分語句
int b = a++;
int c = ++a;
printf("%d %d %d\n", b, c, a);

最佳實踐

  1. 複雜表達式拆分為多語句,用臨時變量存儲中間結果
  2. 利用括號明確分組,而非依賴優先級記憶
  3. 邏輯運算符短路特性用於防護:if (p && *p > 0)
  4. 避免在同一表達式中對同一變量產生副作用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved