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