2015-11-03 32 views
-1
int x = 3; 
System.out.println(x++ + ++x + x++); // 13 

为什么结果13?在复杂语句中如何增加Java运算符的行为

我的逻辑:

  1. ++x在中心给出4
  2. 4 + 4 + 4 = 12所以其结果必然是12
+5

让我们永远不要写这样的代码。没有人应该在生产代码中使用这样的结构。 – duffymo

+0

这是很有趣的分析在Java中,因为它是明确的。请注意,在C和C++中,行为是未定义的。 – Bathsheba

+0

x ++确实发布增量。所以在评估中,值是13 –

回答

7

让我们把它一步一步。首先重要的是要注意表达式从左到右进行评估,所以没有未定义的行为。

int x = 3; 
int res = x++ + ++x + x++ 
// res = (x++) + (++x) + (x++) with x = 3 
// res = 3 + (++x) + (x++) with x = 4 
// res = 3 + 5 + (x++) with x = 5 
// res = 3 + 5 + 5 with x = 6 
// res = 13 

这里的关键部分是:

  • x++返回以前x价值和增值x之后。 JLS section 15.14.2关于“后缀递增运算符++”说:

    后缀增量表达式的值是新的值存储在变量前值。

  • ++x返回下一个x递增值。 JLS section 15.15.1有关“前缀递增运算符++”说:

    前缀增量表达式的值是新的值存储在变量后的值。

+0

非常感谢你!你已经完全解释了! –

3
System.out.println(x++ + ++x + x++); // 13 

        3  5  5 
System.out.println(x++ + ++x + x++); // 13 

x++ - 执行然后递增so 3

++x - above 3 incremented to 4++ X增量第一然后执行,所以4+1=5

x++ - EXE cutes第一增量以后so x=5被使用,but after this execution x becomes 6

+0

非常感谢!你已经解释得很好! –

2

x++是增量之前评估的值的表达式。当你看到x++你可以把它看成

int result = x; 
x = x + 1; 
// do something with result. 

++x可以被认为是

x = x + 1; 
int result = x; 
// do something with result. 

由左到右的问题表达进行评估的。你可以把它想象成

int x = 3 

int result1 = x; // 3 
x = x + 1; 

x = x + 1; 
int result2 = x; // 5 

int result3 = x; // 5 
x = x + 1; 

System.out.println(result1 + result2 + result3); 
+0

谢谢!你已经尝试了很多! –