#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 !我无法理解为什么...如果我们按照运算符的优先级进行,则无法解释。请帮忙
#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 !我无法理解为什么...如果我们按照运算符的优先级进行,则无法解释。请帮忙
逻辑or
( ||
) 引入了一个序列点。评估其左侧。然后,当且仅当它产生 0/false 时,才评估右侧。
在这种情况下,++x
结果为 2,因此永远不会评估右侧。反过来,这意味着y
并z
保持为1
。
||
操作员短路。首先计算左侧操作数,如果计算结果为非零,则永远不会计算右侧操作数。这也防止了对右操作数求值的副作用。
当你使用 || 运算符,如果 LHS 结果为真,则最终结果为真。所以,++x 结果是 1,最终结果是 ++x = 2 和 z = 1 & y = 1
布尔||
短路。也就是说,一旦它找到一个真正的值,它就会停止评估。因此,在 z 赋值中发生的所有事情 x 递增,然后 z 设置为 1