繁体   English   中英

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

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

我当时正在研究运算符优先级,但无法理解x的值如何变成2yz的值如何变成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计算结果为true,并且第二个分支未执行。 ++x2 ,在布尔上下文中,其值为true或1 z取值为1 ,可以观察到最终状态。

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

相当于

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

由于++x返回2 ,该值非零,因此++y && ++z分支不会执行,因此代码等效于:

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

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

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

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

and &&和the || 操作从左到右执行,此外,在C中0表示false ,任何非零值表示true 你写

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

由于x = 1 ,因此语句++xtrue 因此,没有执行进一步的条件++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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM