2015-06-20 126 views
0

我正在学习运算符优先级,我不能够理解的x价值如何成为2和的yz1运算符优先级的声明Z = ++ X ++ ||Ÿ&& ++ž

x=y=z=1; 

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

这个计算结果为

x=2 y=1 z=1 
+2

未定义的行为,在运算符'z'上。 –

+2

检查此[问题](http://stackoverflow.com/questions/29998697/difference-between-i-andi-i); – Himanshu

+2

@ rakeb.void不是在这种情况下。 '||'(和'&&')是一个序列点,其短路行为可以避免评估'++ z'。 – jamesdlin

回答

4

++||更高的优先级,所以分配的整个RHS归结为0的增量以及对真值(1)的评估。

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

这是因为++x的计算结果为真,第二个分支未执行。 ++x2,其在布尔上下文中评估为真或1z取值为1,给你观察到的最终状态。

+0

'z = ++ x || 0;'或'z = !! ++ x;'或'z =(_Bool)++ x;'或'z = ++ x? 1:0;'会更合适。 'z = ++ x;'会是'z = 2;' –

+0

@ChronoKitsune当然可以。编辑。 – juanchopanza

+0

谢谢@juanchopanza – Stopdrake

3

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

注:++||

现在执行此行之后的x值增大,并x=2更高的优先级,现在作为第一个条件是真实的,所以你是++y&&++z永远不会执行得到的值为x=2 y=1 z=1

4
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); 
2

&&||操作是从左到右执行的,此外,在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