C语言中运算符的优先级问题(如何巧妙记忆运算符的优先级顺序)
文章目录C语言中的运算符C语言中运算符的优先级帮助记忆优先级的方法先粗分再细分最后吃透因不明确优先级而造成的常见问题C语言中的运算符C语言中的运算符说多也多,说不多也不多,包括以下运算符:运算符类别运算符下标引用、函数调用和结构成员[ ]、( )、->、.单目运算符!、~、++、–、+、-、sizeof、(type)、*、&算术运算符+、-、*、/、%移位运算符<<、&g
C语言中的运算符
C语言中的运算符说多也多,说不多也不多,包括以下运算符:
| 运算符类别 | 运算符 |
|---|---|
| 下标引用、函数调用和结构成员 | [ ]、( )、->、. |
| 单目运算符 | !、~、++、–、+、-、sizeof、(type)、*、& |
| 算术运算符 | +、-、*、/、% |
| 移位运算符 | <<、>> |
| 关系运算符 | >、>=、<、<=、==、!= |
| 位运算符 | &、^、| |
| 逻辑运算符 | &&、|| |
| 赋值运算符 | =、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>= |
| 条件运算符(三目运算符) | exper1 ? exper2 : exper3 |
| 逗号运算符 | , |
C语言中运算符的优先级
C语言运算符优先级表(由上至下,优先级依次递减)
| 运算符 | 结合性 |
|---|---|
| ( )、[ ]、->、. | L-R |
| !、~、++、–、+、-、(type)、*、&、sizeof | R-L |
| *、/、% | L-R |
| +、- | L-R |
| <<、>> | L-R |
| <、<=、>、>= | L-R |
| ==、!= | L-R |
| & | L-R |
| ^ | L-R |
| | | L-R |
| && | L-R |
| || | L-R |
| =、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>= | R-L |
| exper1 ? exper2 : exper3 | R-L |
| , | L-R |
帮助记忆优先级的方法
先粗分
优先级最高的其实并不是真正意义上的运算符,包括数组下标、函数调用操作符和各结构体成员选择操作符。
单目运算符的优先级仅次于前述运算符,在所有真正意义是的运算符中,单目运算符的优先级最高。
优先级比单目运算符要低的,接下来就是双目运算符。
双目运算符之后就是三目运算符(条件运算符)。
优先级最低的就是逗号运算符了。
再细分
需要进一步细分的就是双目运算符了,我们需要记住:在双目运算符中,算术运算符的优先级最高,移位运算符次之,关系运算符再次之,接着就是位运算符,最后是逻辑运算符。
你们可能以为我忘了双目运算符中还有一个赋值运算符,其实赋值运算符算是一个特例:赋值运算符的优先级低于三目运算符(条件运算符)。
需要注意的最重要的两点是:
- 任何一个逻辑运算符或位运算符的优先级低于任何一个关系运算符。
- 移位运算符的优先级比算术运算符要低,但是比关系运算符要高。
最后吃透
在算术运算符中:*、/、%的优先级高于+、-运算符,这和我们平常的数学算式中要先算乘、除的规则可以对应起来。
在关系运算符中:==和!=的优先级要低于其他关系运算符。
在位运算符和逻辑运算符中:每个“与”运算符要比相应的“或”运算符的优先级高,而且按位异或(^)的优先级介于按位与(&)和按位或(|)之间。
因不明确优先级而造成的常见问题
假设hi和low是两个整数,它们的值介于0和15之间,如果r是一个8位(二进制位)整数,且r的低4位与low各位上的数一致,而r的高4位与hi各位上的数一致,那么r如何表示呢?
我们很容易想到这样一句代码:
r = hi<<4 + low;
这句代码的想法是正确的,但是不幸的是,“+”运算符的优先级高于“<<”运算符的优先级,所以这句代码等效于:
r = hi<<(4 + low);
所以正确写法应该是这样的:
r = (hi<<4) + low;
更多推荐



所有评论(0)