3

令人怀疑的结果是以下代码:

public static void main (String[] args)
{ 
int i = 2;
i = i+=2 + i++;
System.out.println(i); }

期望8作为输出,因为 'i+=2' 应该更新i,但它的行为并非如此。

输出:6

我推断速记赋值运算符按预期返回4,但未在变量 i 中更新相同的值。任何解释将不胜感激。

4

1 回答 1

8

i++是一个后缀增量 - 它增加 i,然后本质上返回 i 的旧值。等效的前缀运算符 ,++i将返回“更新”值,但这不是这里使用的。

i+=2但是,它的工作方式不同,它本质上等同于i+2,因为它确实返回了更新的值。

但是,我认为出现混淆的地方是您正在这样看待它:

i = (i += 2) + i++;

...这确实给了您预期的结果。i+=2给出 4,然后更新i为 4,然后i++返回 4(而不是 5,因为它是后增量。)但是,当您将运算符优先级带入等式时,Java 实际上默认情况下将它“括起来”:

i = i += (2 + i++);

只是为了澄清任何混淆,Java 以这种方式计算它,因为+=运算符在此示例中具有最低优先级,因此+首先计算加法表达式 ()。

这个括号内的陈述本质上等同于:

i = (i = i + (2 + i++));

这反过来又简化为:

i = i + (2 + i++);

所以给定上面的语句,从左到右求值,我们首先取 i (2) 的值,然后将2+i++;的值加到它上面。后者给出 4(因为后缀增量)。所以我们最终的结果是 2+4,也就是 6。

于 2013-05-03T13:31:35.677 回答