Java 表达式期间原始变量重新分配

Java primitive variable reassignment during expression

我在测试中遇到了一个让我感到困惑的问题(下面附有代码)。简而言之,我认为变量被重新分配,然后作为值添加回表达式(使输出为“8, 10”),但似乎原始值不知何故没有改变。我错过了什么?

p.s。抱歉,如果存在类似的问题,我找不到(可能太明显了:P)。

class InitTest{
    public static void main(String[] args){
        int a = 10;
        int b = 20;
        a += (a = 4);
        b = b + (b = 5);
        System.out.println(a + ",  " + b);
    }
}
a += (a = 4);

以上在逻辑上等同于以下:

a = a + (a = 4);

如果我们将 a 替换为现有值,那么这将简化为:

a = 10 + 4 = 14

我们可以对b做同样的事情:

b = b + (b = 5) = 20 + 5 = 25

我们看到这个结果是因为运算符优先级。加法运算符 + 的优先级高于赋值运算符 =,由 Java operator precedence table.

定义

您可以看到 addition-assignment 运算符 += 与赋值运算符具有相同的优先级,在这种情况下表达式从左到右计算。


如果表达式是:

a = (a = 4) + a;
b = (b = 5) + b;

然后它将产生您期望的输出 (a = 8, b = 10),因为左操作数在右操作数之前计算(在计算表达式时)。我将尝试找到 Java 语言规范中指定的位置。

在Java中给变量赋值时,首先计算=号的左边,然后是右边。因此,当您编写 a += (a = 4); 时,它等同于 a = a + (a=4) ,与 a = a + 4 相同,对于 b.