本文转载自C语言中文网:http://c.biancheng.net/view/285.html
前言
C语言的运算优先级经常会让许多初学者头疼不已。在此列表总结,避免今后再次犯错。
优先级 |
| 结合律 |
---|---|---|
1 | 后缀运算符:[] () -> ++ - - (类型名称){列表} | 从左到右 |
2 | 一元运算符:++ - - ! ~ + - * & sizeof_Alignof | 从右到左 |
3 | 类型转换运算符:(类型名称) | 从右到左 |
4 | 乘除法运算符:* / % | 从左到右 |
5 | 加减法运算符:+ - | 从左到右 |
6 | 移位运算符:<< >> | 从左到右 |
7 | 关系运算符:<<= >>= | 从左到右 |
8 | 相等运算符:== != | 从左到右 |
9 | 位运算符 AND:& | 从左到右 |
10 | 位运算符 XOR:^ | 从左到右 |
11 | 位运算符 OR:| | 从左到右 |
12 | 逻辑运算符 AND:&& | 从左到右 |
13 | 逻辑运算符 OR:|| | 从左到右 |
14 | 条件运算符:?: | 从右到左 |
15 | 赋值运算符:= += -= *= /= %= &= ^= |= <<= >>= | 从右到左 |
16 | 逗号运算符:, | 从左到右 |
表中优先级最高的运算符中的最后一个(类型名称){列表} 是 C99 新增加的。
一些运算符记号在表 2 中出现了两次。例如,自增运算符 ++ 和自减运算符 --,在作后缀运算符(如表达式 x++)时,较其用作前缀运算符(如表达式 ++x)时,具有较高的优先级。
+、-、* 和 & 运算符记号不但可以当作一元运算符(unary operator,只需要一个操作数),也可以当作二元运算符(binary operator,需要两个操作数)。例如,* 只有一个操作数的时候,就是间接运算符(indirection operator),而有两个操作数的时候,就是乘号。
在这些例子中,一元运算符比二元运算符具有更高的优先级。例如,表达式 *ptrl**ptr2 等同于表达式(*ptrl)*(*ptr2)。