C操作符的优先级和关联规则
操作符 | 关联规则 |
关联操作符 () [] -> . | 从左到右 |
一元操作符 ! – ++ -- + - (type) * & sizeof | 从右到左 |
乘法和除法 * / % | 从左到右 |
加法和减法 + - | 从左到右 |
移位操作符 << >> | 从左到右 |
关系操作符 < <= > >= | 从左到右 |
相等比较 == != | 从左到右 |
位操作符 & | 从左到右 |
位操作符 ^ | 从左到右 |
位操作符 | | 从左到右 |
逻辑操作符 && | 从左到右 |
逻辑操作符 || | 从左到右 |
条件操作符 ?: | 从右到左 |
赋值操作符 = += -= *= /= | 从右到左 |
逗号 , | 从左到右 |
1.优先级决定操作符与操作数的绑定顺序
2.操作符是按照优先级从高到低顺序与操作数绑定的
3.在确定两个操作符的相对优先级时,首先从这个表格中找到这两个操作符,表中排在上面的比下面的优先级高;当这两个操作符出现在同一行中时,需要根据“关联规则“来决定它们的优先级;如果是”从左到右“,则左边的操作符有更高的优先级;如果是”从右到左“,则右边的操作符有更高的优先级
4.尽量避免优先级不清的表达式写法,用括号明确区分表达式的计算过程
例:
(1) *p++的计算顺序为(*(p++)):因为*和++属于同一行,所以看其关联规则为”从右到左“,因此操作数先与++绑定,再与*绑定
(2) x || !y && z的计算顺序为(x || ((!y) && z)):因为操作符的优先级顺序为! && ||,因此首先!与y绑定,其次&&与(!y)和z绑定,最后||与x和 ((!y) && z)绑定
(3) x | y & z的计算顺序为(x | (y & z))