一元操作与任务融合

Cᴴᴀ*_*ᴴᴀZ 3 java binary-operators unary-operator assignment-operator

令人怀疑的结果如下代码:

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

期待8作为输出,因为'i + = 2'应该更新 i,但它不表现如此.

产量:6

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

Mic*_*rry 8

i++是一个后缀增量 - 它增加i,然后基本上返回i的旧值.等效前缀运算符++i将返回"已更新"值,但这不是此处使用的值.

i+=2然而,它的工作方式不同,它基本上等同于i+2,因为它确实返回更新的值.

但是,我认为出现混乱的地方就是你这样看:

i = (i += 2) + i++;
Run Code Online (Sandbox Code Playgroud)

......这确实给出了你的预期结果.i+=2得到4,并更新i为4,然后i++返回4(而不是5,因为它是一个后增量.)但是,当你将运算符优先级放入等式时,Java实际上默认"括号"它:

i = i += (2 + i++);
Run Code Online (Sandbox Code Playgroud)

为了清除任何混淆,Java会以这种方式对其进行求值,因为在此示例中,+=运算符的优先级最低,因此+首先计算加法表达式().

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

i = (i = i + (2 + i++));
Run Code Online (Sandbox Code Playgroud)

这反过来简化为:

i = i + (2 + i++);
Run Code Online (Sandbox Code Playgroud)

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