前言
复杂表达式的求值顺序是由3个因素决定的:操作符优先级、操作符的结合性、操作符是否控制执行的顺序。
两个相邻的操作符哪个先执行取决于它们的优先级,如果两者优先级相同,那么他们的执行顺序由他们的结合性决定。最后,有4个操作符,他们可以对整个表达式的求值顺序施加控制,它们或者保证某个子表达式能够在另一个子表达式的所有求值过程完成之前进行求值,或者可能使某个表达式被完全跳过不在求值。
术语
lexp表示左值表达式,rexp表示右值表达式。记住,左值意味着一个位置,而右值意味着一个值。
操作符优先级
操作符 | 描述 | 用法示例 | 结果类型 | 结合性 | 是否控制求值求值顺序 |
---|---|---|---|---|---|
() | 聚组 | (表达式) | 与表达式同 | N/A | 否 |
() | 函数调用 | rexp(rexp,…,rexp) | rexp | L-R | 否 |
[] | 下标引用 | rexp[rexp] | lexp | L-R | 否 |
. | 访问结构成员 | lexp.member_name | lexp | L-R | 否 |
-> | 访问结构指针成员 | rexp->member_name | lexp | L-R | 否 |
++ | 后缀自增 | lexp++ | rexp | L-R | 否 |
– | 后缀自减 | lexp– | rexp | L-R | 否 |
! | 逻辑反 | !rexp | rexp | R-L | 否 |
~ | 按位取反 | ~rexp | rexp | R-L | 否 |
+ | 单目,表示正值 | +rexp | rexp | R-L | 否 |
- | 单目,表示负值 | -rexp | rexp | R-L | 否 |
++ | 前缀自增 | ++lexp | rexp | R-L | 否 |
– | 前缀自减 | –lexp | rexp | R-L | 否 |
* | 间接访问 | *rexp | lexp | R-L | 否 |
& | 取地址 | &lexp | rexp | R-L | 否 |
sizeof | 取其长度,以字节表示 | sizeof rexp/sizeof(类型) | rexp | R-L | 否 |
(类型) | 类型转换 | (类型)rexp | rxep | R-L | 否 |
* | 乘法 | rexp*rexp | rexp | L-R | 否 |
/ | 除法 | rexp/rexp | rexp | L-R | 否 |
% | 整数取余 | rexp%rexp | rexp | L-R | 否 |
+ | 加法 | rexp+rexp | rexp | L-R | 否 |
- | 减法 | rexp-rexp | rexp | L-R | 否 |
<< | 左移位 | rexp<<rexp | rexp | L-R | 否 |
>> | 右移位 | rexp>>rexp | rexp | L-R | 否 |
> | 大于 | rexp>rexp | rexp | L-R | 否 |
>= | 大于等于 | rexp>=rexp | rexp | L-R | 否 |
< | 小于 | rexp<rexp | rexp | L-R | 否 |
<= | 小于等于 | rexp<=rexp | rexp | L-R | 否 |
== | 等于 | rexp==rexp | rexp | L-R | 否 |
!= | 不等于 | rexp!=rexp | rexp | L-R | 否 |
& | 位与 | rexp&rexp | rexp | L-R | 否 |
^ | 位异或 | rexp^rexp | rexp | L-R | 否 |
位或 | rexp或rexp | rexp | L-R | 否 | |
&& | 逻辑与 | rexp&&rexp | rexp | L-R | 是 |
逻辑或 | rexp逻辑或rexp | rexp | L-R | 是 | |
?: | 条件操作符 | rexp?rexp:rexp | rexp | N/A | 是 |
= | 赋值 | lexp=rexp | rexp | R-L | 否 |
+= | lexp+=rexp | rexp | R-L | 否 | |
-= | lexp-=rexp | rexp | R-L | 否 | |
*= | lexp*=rexp | rexp | R-L | 否 | |
/= | lexp/=rexp | rexp | R-L | 否 | |
%= | lexp%=rexp | rexp | R-L | 否 | |
<<= | lexp<<=rexp | rexp | R-L | 否 | |
>>= | lexp>>=rexp | rexp | R-L | 否 | |
&= | lexp&=rexp | rexp | R-L | 否 | |
^= | lexp^=rexp | rexp | R-L | 否 | |
, | 逗号 | rexp,rexp | rexp | L-R | 是 |
其他
自增、自减是非常特殊的运算符,需要特别注意。