![](/img/trans.png)
[英]Why does “++x || ++y && ++z” calculate “++x” first, even though operator “&&” has higher precedence than “||”
[英]Operator precedence in C for the statement z=++x||++y&&++z
我当时正在研究运算符优先级,但无法理解x
的值如何变成2
, y
和z
的值如何变成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,并且第二个分支未执行。 ++x
是2
,在布尔上下文中,其值为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
,因此语句++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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.