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