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》摘錄的關於運算子優先順序和結合性的表格,放在這裡方便查閱:
參考:
- 《The C Programming Language中文版(第2版.新版)》
- 《C專家程式設計》