一元操作与任务融合

时间:2013-05-03 13:28:10

标签: java assignment-operator unary-operator binary-operators

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

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

期待 8 作为输出,因为'i + = 2'应该更新 i,但它的表现不正常。

  

输出:6

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

1 个答案:

答案 0 :(得分: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会以这种方式对其进行评估,因为+=运算符has least precedence in this example,因此首先计算加法表达式(+)。

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

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

反过来简化为:

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

因此,鉴于上述陈述,并从左到右进行评估,我们首先取i(2)的值,然后将2+i++的值加到其中;后者给出4(因为后缀增量)。所以我们的最终结果是2 + 4,即6。