我正在学习运算符优先级,我不能够理解的x
价值如何成为2
和的y
和z
是1
运算符优先级的声明Z = ++ X ++ ||Ÿ&& ++ž
x=y=z=1;
z=++x||++y&&++z;
这个计算结果为
x=2 y=1 z=1
我正在学习运算符优先级,我不能够理解的x
价值如何成为2
和的y
和z
是1
运算符优先级的声明Z = ++ X ++ ||Ÿ&& ++ž
x=y=z=1;
z=++x||++y&&++z;
这个计算结果为
x=2 y=1 z=1
++
比||
更高的优先级,所以分配的整个RHS归结为0的增量以及对真值(1)的评估。
z = ++x || ++y&&++z;
truthy (1) never executed
这是因为++x
的计算结果为真,第二个分支未执行。 ++x
是2
,其在布尔上下文中评估为真或1
。 z
取值为1
,给你观察到的最终状态。
'z = ++ x || 0;'或'z = !! ++ x;'或'z =(_Bool)++ x;'或'z = ++ x? 1:0;'会更合适。 'z = ++ x;'会是'z = 2;' –
@ChronoKitsune当然可以。编辑。 – juanchopanza
谢谢@juanchopanza – Stopdrake
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
返回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
。
未定义的行为,在运算符'z'上。 –
检查此[问题](http://stackoverflow.com/questions/29998697/difference-between-i-andi-i); – Himanshu
@ rakeb.void不是在这种情况下。 '||'(和'&&')是一个序列点,其短路行为可以避免评估'++ z'。 – jamesdlin