C 中语句 z=++x||++y&&++z 的运算符优先级

Operator precedence in C for the statement z=++x||++y&&++z

我正在研究运算符优先级,但我无法理解 x 的值如何变为 2 以及 yz 的值如何变为 1

x=y=z=1;

z=++x||++y&&++z;

计算结果为

x=2 y=1 z=1

++|| 具有更高的优先级,因此赋值的整个 RHS 归结为 x 的增量和对真值 (1) 的评估。

z = ++x         ||  ++y&&++z;
    truthy (1)     never executed

这是因为++x计算结果为真,第二个分支没有执行。 ++x2,在布尔上下文中,它的计算结果为 true 或 1z1 的值,给你观察到的最终状态。

z=++x||++y&&++z;

注意:++ 的优先级高于 ||

现在,在执行此行后,x 的值会递增,并且 x=2 现在 ++y&&++z 永远不会执行,因为第一个条件为真,因此您得到的值为x=2 y=1 z=1

x=y=z=1
z=++x||++y&&++z

等同于

x=y=z=1
z=((++x)||((++y)&&(++z)));

因为 ++x returns 2 是非零的,++y && ++z 分支永远不会执行,因此代码等同于:

x=y=z=1;
z=(++x)||(anything here);

&&||操作从左到右执行,而且,在 C 中,0 表示 false,任何非零值表示 true。你写

x=y=z=1;
z= ++x || ++y && ++z;

因为,x = 1,所以语句++x就是true。因此,进一步的条件 ++y && ++z 未执行。

所以输出变成了:

x=2 // x incremented by 1
y=1 // as it is
z=1 // assigned to true (default true = 1)

现在试试这个,

z= ++y && ++z || ++x ;

您将获得

x=1 // as it is because ++y && ++z are both true 
y=2 // y incremented by 1
z=1 // although z incremented by 1 but assigned to true (default true = 1)

最后试试这个:

int x = 1;
int y = 0;
int z = 1;

z= y && ++z || ++x;

输出将是:

所以输出变成了:

x=2 
y=0 
z=0 

因为,现在 z 的语句是这样的:

z = false (as y =0) && not executed || true
z = false || true
z = true

因此,y 保持不变,x 增加并变为 2,最后 z 分配给 true