表达式期间的Java基本变量重新分配

问题描述

我在测试中有一个问题令我感到困惑(下面的代码)。简而言之,我认为已重新分配了变量,然后将其作为值添加回表达式中(使输出为“ 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的定义,加法运算符+的优先级高于赋值运算符=

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


相反,表达式为:

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

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

,

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