C語言常被搞錯的運算子優先順序

rexnie發表於2018-05-07

C語言的運算子有優先順序和結合性兩個屬性,而且相同的符號存在複用的情況,所以很容易造成錯誤。這裡有個建議,多給表示式加上括號,可以提高程式碼的可讀性和減少錯誤的發生。

C語言運算子優先順序存在的問題
優先順序問題 表示式 人們可能誤以為的結果 實際結果

.的優先順序高於*

->操作符用於消除這個問題
*p.f

p所指向的物件的f域

(*p).f
*(p.f)
[]高於* int *ap[]

ap是指向int陣列的指標

int (*ap)[]

ap是個元素為int指標的陣列

int *(ap[])
函式()高於* int *fp()

fp是個函式指標,所指向的函式返回int.

int (*fp)()

fp是個函式,函式返回int的指標.

int *(fp())
==和!=高於位操作符 (val & mask != 0) (val & mask) != 0 (val & (mask != 0))
==和!=高於賦值操作 c = getchar() != EOF (c = getchar()) != EOF c = (getchar() != EOF)
算術運算高於移位運算子 msb << 4 + lsb (msb << 4) + lsb msb << (4 + lsb)
逗號運算子在所有運算子中優先順序最低 i = 1, 2 i = (1, 2) (i = 1), 2

下面是從《The C Programming Language》摘錄的關於運算子優先順序和結合性的表格,放在這裡方便查閱:

C語言常被搞錯的運算子優先順序

參考:

  1. 《The C Programming Language中文版(第2版.新版)》
  2. 《C專家程式設計》

相關文章