在Java中,a = (a++) * (a++)会产生奇怪的结果。

45

我正在准备 OCPJP 考试,因此必须了解 Java 的每一个细节。这包括前缀和后缀增量运算符应用于变量的顺序。以下代码给出了奇怪的结果:

int a = 3;

a = (a++) * (a++);

System.out.println(a); // 12

答案难道不应该是11吗?或者可能是13?但绝不是12!

接下来的问题:

以下代码的结果是什么?

int a = 3;

a += (a++) * (a++);

System.out.println(a);

58
没有人应该编写这样的代码。相信编译器——它比你更了解Java。我认为这是正确的:第一次计算返回3,第二次返回4。最终a的值为5。 - duffymo
9
@duffymo: 这就是我对OCJP考试中的每个问题的看法。 - Pops
57
如果你说希望11或13成为结果,我不明白为什么会这样想,因为11和13都是质数。如果你说"9",我可以理解你的困惑,有点道理。 - Brian Roach
14
需要你知道这种无聊的东西才能通过考试? - Oliver Charlesworth
22
这是后置自增操作,因此它的含义是 a = 3 (->4) * 4 (->5) // = 3*4 = 12 - Smamatti
显示剩余24条评论
15个回答

2

现在是12点。 表达式从左侧开始计算。所以它执行以下操作:

a = (3++) * (4++);

第一部分(3++)被评估后,a变成了4,因此在下一部分中,它执行a = 3 * 4 = 12。请注意,最后的后增量(4++)被执行但没有影响,因为此时a已经被赋值为12。


1

示例1

int a = 3;

a = (++a) * (a++);

System.out.println(a); // 16

示例2

int a = 3;

a = (++a) * (++a);

System.out.println(a); // 20

只是为了确保在哪里放置++表达式,该表达式根据位置更改值。


1
每个人都清楚地解释了第一个表达式,以及为什么a的值是12。
对于接下来的问题,答案对于任何人都显而易见:
17

0
如果你使用a++,下一次使用a时它会增加一。所以你正在做的是
a = 3 * (3 + 1) = 3 * 4 = 12

0

前缀和后缀自增运算符的优先级高于乘法运算符。因此,该表达式被计算为3*4。


谈论优先级的方式非常误导。 - CodesInChaos
因为前缀和后缀增量是一元操作(即它们只需要一个操作数),所以它们具有更高的优先级。它们的工作方式类似于否定。还应该注意的是,有括号可以强制优先级,这样编译器就不会真正做出任何选择。此外,您不能在除变量之外的任何东西上使用前缀或后缀增量 - (因此++(1 + 2))是非表达式,并将被标记为语法错误。 - Zeke Hansell

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