前言
这几天在看 《C陷阱与缺陷》看到有些陷阱自己也老跳进去,比如我想判断a与b是否等于0,我会写出以下的句子:
if(a&b == 0)
但由于==的优先级比&高,所以上面的句子实际上是被解释为:
if(a&(b==0))
又比如r=hi<<4+low实际上是被解析为r=hi<<(4+low)(因为加法运算的优先级要比移位运算的优先级高)
运算符优先级
分类
- 算术运算符:* - + /
- 关系运算符: > < == != >= <=
- 逻辑运算符:! && ||
- 位运算符:<< >> ~ | ^ &
- 赋值运算符:=及扩展赋值运算符
- 条件运算符:?:
- 逗号运算符:,
- 指针运算符:*和&
- 求字节数运算符:sizeof
- 强制类型转换运算符:(类型)
- 分量运算符:. ->
- 下标运算符:[ ]
- 其他:如函数调用运算符:()
注意:条件运算符是C语言中惟一一个三目(三元)运算符
怎么记忆
优先级表我就不贴了,网上一堆。
首先,优先级最高的不是真正意义上的运算符,包括:数组下标、函数调用操作符各结构成员选择操作符。它们都是自左于右结合。
其次,是单目运算符,在所有的真正意义上的运算符中,它们的优先级最高。因为函数调用的优先级要高于单目运算符的优先级,所以如果p是一个函数指针,要调用p所指向的函数,必须这样写:(*p)()。
接下来是双目运算符,在双目运算符中,算术运算符的优先级最高,移位运算符次之,关系运算符再次之,接着是逻辑运算符,赋值运算符。
重点:
- 任何一个逻辑运算符的优先级低于任何一个关系运算符
- 移位运算符的优先级比算术运算符要低,但是比关系运算符要高
在6个关系运算符中,==和!=的优先级要低于其他关系运算符。
最后是三目运算符和逗号运算符(逗号运算符优先级最低)
参考资料
- 《C陷阱与缺陷》
- 《C程序设计语言》