以下代码中的结果令人怀疑:
public static void main (String[] args)
{
int i = 2;
i = i+=2 + i++;
System.out.println(i); }
期待 8 作为输出,因为'i + = 2'应该更新 i,但它的表现不正常。
输出:6
我推断短手赋值运算符按预期返回 4 ,但不会在变量i中更新相同的值。任何解释将不胜感激。
答案 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。