运算符的优先级和结合性
优先级 | 运算符名称 | 运算符符号 | 结合性 |
1 | 自增(后缀) 自减(后缀) 函数调用 数组下标 取结构或者联合的成员(通过对象名) 取结构或者联合的成员(通过指针) |
++ -- ( ) [ ] . -> |
左结合性 |
2 | 自增(前缀) 自减(前缀) 正号 负号 按位取反 逻辑非 强制类型转换 间接寻址 取地址 计算空间 对齐 |
++ -- + - ~ ! ( ) * & sizeof _Alignof |
右结合性 |
3 | 乘法 除法 取余 |
* / % |
左结合性 |
4 | 加法 减法 |
+ - |
左结合性 |
5 | 左移 右移 |
<< >> |
左结合性 |
6 | 大于 大于等于 小于 小于等于 |
> >= < <= |
左结合性 |
7 | 等于 不等于 |
== != |
左结合性 |
8 | 按位与 | & | 左结合性 |
9 | 按位异或 | ^ | 左结合性 |
10 | 按位或 | | | 左结合性 |
11 | 逻辑与 | && | 左结合性 |
12 | 逻辑或 | || | 左结合性 |
13 | 条件 | ? : | 右结合性 |
14 | 赋值 |
= += -= *= /= %= <<= >>= &= ^= |= |
右结合性 |
15 | 逗号 | , | 左结合性 |
表中运算符的优先级按优先级编号从上到下逐步降低,优先级编号相同的运算符优先级相同。
例如:2*3+4
因为*运算符优先级高于+运算符,所有先执行2*3,然后再将结果与4相加。
在一个表达式中,如果存在多个优先级相同的运算符,将由运算符的结合性决定执行顺序。
例如:2*3/4
*运算符与/运算符优先级相同,两者都是左结合性,所以先执行左边的2*3,然后再将结果除以4。