#include<stdio.h>
void main(){
int x,y,z;
x=y=z=1;
z=++x||++y&&++z;
printf("%d %d %d \n",x,y,z);
getch();
}
输出为2 1 1!我无法理解......如果我们按操作符的优先顺序进行操作,则无法解释。请帮忙
答案 0 :(得分:6)
逻辑or
(||
)引入了一个序列点。它的左侧被评估。然后,当且仅当它产生0 /假时,才评估右侧。
在这种情况下,++x
出现为2,因此永远不会评估右侧。反过来,这意味着y
和z
仍为1
。
答案 1 :(得分:3)
||
运算符短路。首先计算左侧操作数,如果计算结果为非零,则从不计算右侧操作数。这也可以防止评估右操作数的副作用。
答案 2 :(得分:1)
使用||时运算符,如果LHS证明是真的,那么最终结果是正确的。因此,它确实是++ x,结果是1,最终结果是++ x = 2,z = 1&amp; y = 1
答案 3 :(得分:1)
布尔||
短路。这是一旦它找到一个真正的价值,它就会停止评估。因此,z赋值x中发生的所有情况都会增加,z会设置为1然后
答案 4 :(得分:0)
以上答案的附录:
在C / C ++中,这些运算符是短路运算符,即&#39;&amp;&amp;&#;;&#39; ||&#39;和&#39;?&#39;(条件运算符)。
帮自己一个忙,看看这个excellent wiki page on Short-circuit evaluation。 不要错过文章的Common usage部分。