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.
我在测试中遇到了一个让我感到困惑的问题(下面附有代码)。简而言之,我认为变量被重新分配,然后作为值添加回表达式(使输出为“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.