x = y = z = 1;
z = ++x||++y&&++z;
Run Code Online (Sandbox Code Playgroud)
运算符优先级如下 -
(pre-increment) > && > ||
Run Code Online (Sandbox Code Playgroud)
所以回答应该是 -
1. 2||2 && 2
2. 2||1
3. 1
print x,y,z should be 2,2,1
Run Code Online (Sandbox Code Playgroud)
但是,答案是2,1,1.
ver*_*ose 12
优先顺序与评估顺序不同.优先级简单地确定操作数和运算符属于一起.除了逻辑运算符之外,没有指定评估的确切顺序,逻辑运算符以严格的从左到右的顺序进行评估以启用短路.
因此&&
具有更高的优先级,变量首先分组如下:
(++x) || (++y && ++z)
Run Code Online (Sandbox Code Playgroud)
然后,按照从左到右的顺序++x
进行评估.鉴于这++x
是真的,众所周知,整个表达式都是正确的.所以表达评估是短路的. (++y && ++z)
永远不会被评估.因此y和z永远不会增加.
表达式与逻辑运算符&&
并||
从左到右评估:
C99,第6.5.14-4节与按位运算
|
符不同,运算||
符保证从左到右的评估; 在评估第一个操作数后有一个序列点.如果第一个操作数与不相等0
,则不计算第二个操作数.
由于x++
不是零,表达式将对所有内容的评估短路||
,包括它们的副作用.这就是为什么只x++
评估,所以x
成为2
.其余变量保持不变1
.