C 语言运算符优先级
C 語言運(yùn)算符優(yōu)先級
| 1 | ++ -- | 后綴自增與自減 | 從左到右 |
| () | 函數(shù)調(diào)用 | ||
| [] | 數(shù)組下標(biāo) | ||
| . | 結(jié)構(gòu)體與聯(lián)合體成員訪問 | ||
| -> | 結(jié)構(gòu)體與聯(lián)合體成員通過指針訪問 | ||
| (type){list} | 復(fù)合字面量(C99) | ||
| 2 | ++ -- | 前綴自增與自減 | 從右到左 |
| + - | 一元加與減 | ||
| ! ~ | 邏輯非、逐位取反 | ||
| (type) | 類型轉(zhuǎn)換 | ||
| * | 解引用 | ||
| & | 取地址 | ||
| sizeof | 取大小 | ||
| _Alignof | 對其要求(C11) | ||
| 3 | * / % | 乘法、除法、求余 | 從左到右 |
| 4 | + - | 加法、減法 | |
| 5 | << >> | 左移、右移 | |
| 6 | < <= | 小于、小于等于 | |
| > >= | 大于、大于等于 | ||
| 7 | == != | 等于、不等于 | |
| 8 | & | 逐位與 | |
| 9 | ^ | 逐位異或 | |
| 10 | | | 逐位或 | |
| 11 | && | 邏輯與 | |
| 12 | || | 邏輯或 | |
| 13 | ? : | 三元條件 | 從右到左 |
| 14 | = | 簡單賦值 | |
| += -= | 以和賦值、以差賦值 | ||
| *= /= %= | 以積、商及余數(shù)賦值 | ||
| <<= >>= | 以逐位左移及右移賦值 | ||
| &= ^= |= | 以逐位與、異或及或賦值 | ||
| 15 | , | 逗號 | 從左到右 |
如何理解優(yōu)先級
分析表達(dá)式時(shí),操作數(shù)首先與較高優(yōu)先級的運(yùn)算符結(jié)合(如同用括號)。例如,表達(dá)式 *p++ ,因?yàn)楹缶Y自增++比解引用*的優(yōu)先級高,所以p先和++結(jié)合,所以被分析為 *(p++),而非 (*p)++ 。
如何理解結(jié)合性
當(dāng)運(yùn)算符具有相同優(yōu)先級時(shí),操作數(shù)按照結(jié)合性來結(jié)合。例如表達(dá)式 a = b = c ,b 的兩側(cè)都是=,優(yōu)先級相同,但是=的結(jié)合性是從右到左,即右邊的優(yōu)先,所以 b 優(yōu)先與右邊的=結(jié)合,所以被分析為 a = (b = c) 而非(a = b) = c。
幾點(diǎn)注意
例如:表達(dá)式 f1() + f2() + f3() 被分析成 (f1() + f2()) + f3() ,因?yàn)?+的結(jié)合性從左到右。但運(yùn)行時(shí)對 f3 的函數(shù)調(diào)用可以最先、最后,或在 f1() 與 f2() 之間求值,同理, f1() 與 f2() 各自的求值順序也不一定。
C 語言標(biāo)準(zhǔn)不指定運(yùn)算符優(yōu)先級。它指定語言文法,而優(yōu)先級表格從它導(dǎo)出,以簡化理解。
結(jié)合性規(guī)定對于一元運(yùn)算符是冗余的,且只為完備而顯示:一元前綴運(yùn)算符始終從右到左結(jié)合(例如++*p 為++(*p));而一元后綴運(yùn)算符始終從左到右結(jié)合( 例如 a[1][2]++為((a[1])[2])++)。
結(jié)合性對成員訪問運(yùn)算符有意義:a.b++ 分析為(a.b)++而非 a.(b++) 。
sizeof 的操作數(shù)不能是類型轉(zhuǎn)型:表達(dá)式 sizeof (int) * p 無歧義地轉(zhuǎn)譯成 (sizeof(int)) * p ,而非 sizeof((int)*p) 。
條件運(yùn)算符中部( ? 與 : 之間)的表達(dá)式分析為如同加括號:忽略其相對于 ?: 的優(yōu)先級。
參考資料
https://zh.cppreference.com/w/c/language/operator_precedence
總結(jié)
以上是生活随笔為你收集整理的C 语言运算符优先级的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android小程序下线,关闭小程序
- 下一篇: 重载运算符