| 運算式 |
優先順序 |
| ()(小括弧) [](數組下標) .(結構成員) ->(指標型結構成員) |
↑最高 |
| !(邏輯非) .(位取反) -(負號) ++(加1) --(減1) &(變數地址) |
│ |
| *(指標所指內容) type(函數說明) sizeof(長度計算) |
│ |
| *(乘) /(除) %(模數) |
│ |
| +(加) -(減) |
│ |
| <<(位左移) >>(位右移) |
│ |
| <(小於) <=(小於等於) >(大於) >=(大於等於) |
│ |
| ==(等於) !=(不等於) |
│ |
| &(位與) |
│ |
| ^(位異或) |
│ |
| |(位或) |
│ |
| &&(邏輯與) |
│ |
| ||(邏輯或) |
│ |
| ?:(?運算式) |
│ |
| = += -=(聯合操作) |
│ |
| ,(逗號運算子) |
│最低 |
1. .的優先順序高於*。->操作符用於消除這個問題。
*p.f變成了*(p.f)而不是(*p).f
2. []高於*,於是int *ap[]中的ap變成了元素為int指標的數組。
3. 函數()高於*,因此,int *fp()不再是函數指標了,而是一個函數,返回int *。
4. 逗號運算子在所有運算子中優先順序最低,所以,i = 1, 2就成了(i = 1), 2而不是i = (1, 2)。
逗號運算子的值是最右邊運算元的值,逗號運算子結合性從左至右,因此又稱為順序求值運算子。
5. 在運算式中如果有布爾操作、算術運算、位操作等混合計算,始終應該在適當的地方加上括弧。
x = f() + g() * h(); 乘法先於加法執行,但是g()和h()的調用可能以任何順序出現。同樣,f()可能在乘法之前調用,也可能在乘法之後調用。
優先順序和結合性規則告訴你哪些符號組成一個意群,大部分這樣的意群內部如何進行計算的次序是未定義的。
有些操作符,如&&和||等,其運算元的計算順序是確定的,它們使用短路原則。
C語言中記住兩個優先順序就夠了:乘法和除法先於加法和減法,在涉及其他動作符時一律加上括弧。
結合性用於在幾個操作符具有相同的優先順序時確定先執行哪一個。
每個操作符擁有某一層級的優先順序,同時也擁有左結合性或者右結合性。
所有的賦值符(包括複合賦值符)都具有右結合性(從右至左執行),因此可以使用連等的賦值形式。
唯一的三目運算子?:也是具有右結合性的。
所有優先順序相同的操作符,它們的結合性也相同,這是必須如此的。
在函數調用中,各個參數的計算順序是不確定的。