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

C 語言運算子優先級陷阱與結合性完整分析

     編輯:關於C語言

七大經典優先級錯誤

#錯誤程式碼誤以為結果實際結果原因
1*p.f(*p).f*(p.f). 優先級 > *
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)!= > =
6msb << 4 + lsb(msb << 4) + lsbmsb << (4 + lsb)+ > <<
7i = 1, 2i = (1, 2)(i = 1), 2, 最低優先級

結合性規則

  • 右結合:賦值運算子(= += -= *= /= %= &= ^= |= <<= >>=)、條件運算子 ?:、一元運算子、型別轉換
  • 左結合:其他所有二元運算子(算術、位元、關係、邏輯、逗號)

右結合實例

int a, b = 1, c = 2;
a = b = c;  // 等價 a = (b = c) → a=2, b=2

左結合實例

int x = 8 / 4 / 2;  // (8/4)/2 = 1,非 8/(4/2)=4

未指定行為警示

C 標準不保證下列情況的運算順序:

  • 函數引數求值順序:func(a(), b()) 不保證 a() 先於 b()
  • 運算元求值順序:i = i++ + i++ 行為未定義
  • printf("%d %d", i++, i++) 輸出順序不確定

最佳實務

  1. 混合運算子時加括號明確意圖
  2. 避免同一語句多次修改同一變數
  3. 函數引數中避免副作用(遞增、賦值、I/O)
  4. 使用靜態分析工具(-Wall -Wextra、cppcheck、clang-tidy)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved