int x = 3;
System.out.println(x++ + ++x + x++); // 13
为什么结果13?在复杂语句中如何增加Java运算符的行为
我的逻辑:
++x
在中心给出44 + 4 + 4 = 12
所以其结果必然是12
int x = 3;
System.out.println(x++ + ++x + x++); // 13
为什么结果13?在复杂语句中如何增加Java运算符的行为
我的逻辑:
++x
在中心给出44 + 4 + 4 = 12
所以其结果必然是12让我们把它一步一步。首先重要的是要注意表达式从左到右进行评估,所以没有未定义的行为。
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有关“前缀递增运算符++
”说:
前缀增量表达式的值是新的值存储在变量的后的值。
非常感谢你!你已经完全解释了! –
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
非常感谢!你已经解释得很好! –
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);
谢谢!你已经尝试了很多! –
让我们永远不要写这样的代码。没有人应该在生产代码中使用这样的结构。 – duffymo
这是很有趣的分析在Java中,因为它是明确的。请注意,在C和C++中,行为是未定义的。 – Bathsheba
x ++确实发布增量。所以在评估中,值是13 –