问题描述
我在测试中有一个问题令我感到困惑(下面的代码)。简而言之,我认为已重新分配了变量,然后将其作为值添加回表达式中(使输出为“ 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 = 8
,b = 10
),因为左操作数是在右操作数之前计算的(计算表达式时)。我将尝试查找Java语言规范中指定的位置。
在Java中,当给变量赋值时,首先计算的是=号的左侧,然后是右侧。因此,当您编写与a += (a = 4);
相同的a = a + (a=4)
等效的a = a + 4
时,b相同。