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

C語言運算符優先級陷阱大全:避開這7大「設計缺陷」

     編輯:關於C

為什麼優先級會「坑」人?

C 語言早期設計時,為了兼容既有代碼與硬件特性,部分運算符優先級的安排並不符合直覺,甚至被丹尼斯·里奇事後承認為「錯誤」。若不加括號,極易寫出語義與預期完全相反的代碼。

七大經典反直覺優先級

#表達式直覺理解實際解析結果差異
1*p.f(*p).f 取指向結構體指針的成員*(p.f) 先取 p 的成員 f 再解引用結構體指針 vs 結構體成員指針
2int *ap[]int (*ap)[] 指向數組的指針int *(ap[]) 指針數組完全不同的類型聲明
3int *fp()int (*fp)() 函數指針int *(fp()) 返回指針的函數聲明語義顛倒
4val & mask != 0(val & mask) != 0val & (mask != 0) 先做關係運算位運算變邏輯判斷
5c = getchar() != EOF(c = getchar()) != EOFc = (getchar() != EOF) 先比較再賦值 0/1讀取字符 vs 讀取布爾值
6msb << 4 + lsb(msb << 4) + lsbmsb << (4 + lsb) 先加法再移位移位位數錯誤
7i = 1, 2i = (1, 2) 逗號運算符整體賦值(i = 1), 2 先賦值 1,逗號後表達式被丟棄i 為 1 而非 2

結合性補充

  • 右結合:所有賦值運算符(`=` `+=` `-=` 等)、一元運算符、`?:`。例:`a = b = c` 等價 `a = (b = c)`。
  • 左結合:算術、位運算、關係、邏輯、`.` `->` `[]` `()` 等。例:`a - b - c` 等價 `(a - b) - c`。

最佳實踐

  1. 原則:寧可多打括號,不可賭優先級。 尤其混合位運算、關係運算、賦值時。
  2. 利用編譯器警告:-Wparentheses(GCC/Clang)可提示潛在優先級問題。
  3. 查閱 標準優先級表,將常見陷阱印成速查卡貼在工位。

「好的代碼不僅能讓編譯器理解,更能讓六個月後的自己秒懂。」—— 加括號,是對未來維護者最大的善意。

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