优先级和结合性
1. 结合性
当多个优先级相同的运算符作用于同一个操作数,需要有规则决定计算的顺序
举例:
a + b + c
中,由于加法具有左结合性,所以操作数b
属于左边的+
。把这个表达式用树形表示就是:
2. 优先级
3. 优先级和结合性表
下表列举了 C 语言中所有运算符的优先级和结合性。
注:标准中没有单独规定运算符的优先级,优先级由词法推出
优先级 | 运算符 | 描述 | 结合性 |
---|---|---|---|
1 | ++ -- | 后缀自增与自减 | 从左到右 |
() | 函数调用 | 从左到右 | |
[] | 数组下标 | 从左到右 | |
. | 结构体与联合体成员访问 | 从左到右 | |
-> | 结构体与联合体成员通过指针访问 | 从左到右 | |
(type){list} | 复合字面量 | 从左到右 | |
2 | ++ -- | 前缀自增与自减 | 从右到左 |
+ - | 一元加与减 | 从右到左 | |
! ~ | 逻辑非与逐位非 | 从右到左 | |
(type) | 转型 | 从右到左 | |
* | 解引用 | 从右到左 | |
& | 取址 | 从右到左 | |
sizeof | 取大小 | 从右到左 | |
_Alignof | 对齐要求 | 从右到左 | |
3 | * / % | 乘法、除法及余数 | 从左到右 |
4 | + - | 加法及减法 | 从左到右 |
5 | << >> | 逐位左移及右移 | 从左到右 |
6 | < <= | 小于,小等于 | 从左到右 |
> >= | 大于,大等于 | 从左到右 | |
7 | == != | 等于,不等于 | 从左到右 |
8 | & | 逐位与 | 从左到右 |
9 | ^ | 逐位异或 | 从左到右 |
10 | | | 逐位或 | 从左到右 |
11 | && | 逻辑与 | 从左到右 |
12 | || | 逻辑或 | 从左到右 |
13 | ?: | 三元条件 | 从右到左 |
14 | = | 简单赋值 | 从右到左 |
+= -= | 以和/差赋值 | 从右到左 | |
*= /= %= | 以积/商/余数赋值 | 从右到左 | |
<<= >>= | 以逐位左移/逐位右移赋值 | 从右到左 | |
&= ^= |= | 以逐位与/逐位异或/逐位或赋值 | 从右到左 | |
15 | , | 逗号 | 从左到右 |