Java中的后缀自增与加法

4
我在Java中有以下代码:
int x=5;
System.out.println(x++ + ++x);

输出结果为12。

我本以为应该是11。

我们有三个运算符:

  • +加法
  • ++(后置)
  • ++(前置)
  • 列表项

上面的打印语句按照哪个顺序编译?

如果我写int x=5;然后再写++xx==6还是x==5,因为我没有写x=++x。新值是否被存储在x中?

想要记住Java或.NET中运算符优先级的方法,就像我们有DMAS一样。这里有类似的比喻吗?


2
你明白吗,如果人们停止做愚蠢的事情,他们就不需要像这样问问题了,是吗? :-) 说真的,到底是谁写出像 x++ + ++x 这样的代码的? - paxdiablo
1
@paxdiablo 如果在考试中我必须写出以下语句的输出,虽然只有1分,但我应该说“到底是谁出这道题”的话吗 :) - user1765876
@user1765876,说真的,我会(a)回答这个问题,(b)问教授为什么会问这样的问题,因为在实际工作中你是绝对不会遇到这种情况的。但是,我是从毕业后的舒适世界来说这些话的,教授已经不能再影响我了。 ;) - yshavit
@yshavit 我同意我们在现实世界中不会看到这样的事情,但是这样的问题是检查/确保学生概念的绝佳方式。 - user1765876
6个回答

5

x++ 等于 5,但 x 已经变成了 6++x 意味着 6 被增加了 1,也就是说 ++x7。因此,5 + 7 = 12 是正确的答案。


2
在C和C++中,这种行为是未定义的(因为,在这些语言中,+不对两个表达式进行排序)。
但在Java中,它是被定义的。求值顺序是从左到右的。
非常简单:第一个表达式是x ++,它的值为5,但将x增加到6。
第二个表达式是++ x,它将x从6增加到7,并具有值7。
5 + 7 = 12:完成。
不用说,这种代码是不推荐的。对于C / C ++来说,移植会是灾难性的。

1
在一些 C 程序员开始产生任何想法之前,需要提到在 C/C++ 中它是未定义的。好像 C 的语义还不够复杂。 - smac89

1
评估/增量将在加号运算符之前依次发生。
您的println步骤如下:
(x++ + ++x),其中x=5
(5++ + ++x),其中x=5
(5 + ++x),其中x=6
(5 + x),其中x=7
(5 + 7)=12
在对x求和之前,您对x进行了2次增量,从5到7,这就解释了总和为12。

1

在这行中

System.out.println(x++ + ++x);

首先,x 的值为5,所以执行 x++ 后,x 的值将变为6,但是表达式的计算会在增量之前完成,因此你会得到:

5 + ++x

此时x为6,因此++x将首先将x增加到7,然后评估表达式。最终你会得到:

5 + 7

这是 12


1

post increment

在表达式求值过程中,只使用预增量的值。(后增运算符在表达式求值完成后立即使用)这可能会对您有所帮助。
   =x++ + ++x
   =x++ + 6
   =6 + 6
   =12

这与其他答案(5和7)相矛盾,可能不正确。 - Osman-pasha

0
重点是:
x++ 在表达式中赋值后增加 x 的值。 ++x 在表达式中增加 x 的值后再进行赋值。
因此,在你的例子中,实际上执行了 5 + 7。 5 是因为在求值后增量才被执行,因此 x 变为 6。 7 是因为在求值前增量就已经被执行,因此 x 变为 7。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接