英文:
Java primitive variable reassignment during expression
问题
我在测试中遇到了一个让我感到困惑的问题(以下附有代码)。简单说,我认为变量被重新赋值,然后作为值添加回表达式中(使输出为"8, 10"),但似乎原始值在某种程度上并未更改。我漏掉了什么?
附言:如果存在类似的问题,我很抱歉,我找不到类似的问题(可能太明显了: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);
}
}
英文:
I had a question in my test that I got confused about (code attached below). To put it shortly, I thought that the variables are reassigned and then added back as a value to the expression (making the output "8, 10") but seems like the original value somehow is not changed. What am I missing?
p.s. Sorry if a similar question exists, I couldn't find one (probably its too obvious :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);
}
}
答案1
得分: 1
a += (a = 4);
上述代码在逻辑上等同于以下内容:
a = a + (a = 4);
如果我们用现有的变量值替换 `a`,则简化为:
a = 10 + 4 = 14
我们可以对变量 `b` 做同样的操作:
b = b + (b = 5) = 20 + 5 = 25
我们得到这个结果是因为运算符优先级。加法运算符 `+` 的优先级高于赋值运算符 `=`,这是由 Java [运算符优先级表](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html) 定义的。
可以看出,加法赋值运算符 `+=` 与赋值运算符共享相同的优先级,在这种情况下,表达式从左到右进行评估。
---
相反,如果表达式是:
a = (a = 4) + a;
b = (b = 5) + b;
那么它将得到您期望的输出(`a = 8`,`b = 10`),因为在计算表达式时会先计算左操作数,然后再计算右操作数。我会尝试查找这在 Java 语言规范中的具体规定位置。
英文:
a += (a = 4);
The above is logically equivalent to the following:
a = a + (a = 4);
If we substitute in the existing value for a
, then this simplifies to:
a = 10 + 4 = 14
We can do the same for b
:
b = b + (b = 5) = 20 + 5 = 25
We see this result because of operator precedence. The addition operator, +
, has a higher precedence than the assignment operator, =
, as defined by the Java operator precedence table.
You can see that the addition-assignment operator, +=
, shares the same precedence with the assignment operator, in which case the expression is evaluated from left to right.
If, instead, the expressions were:
a = (a = 4) + a;
b = (b = 5) + b;
Then it would result in the output that you expect (a = 8
, b = 10
), as the left operand is computed before the right operand (when evaluating the expression). I'll try to locate where this is specified in the Java Language Specification.
答案2
得分: -1
在Java中,当将一个值赋给一个变量时,首先计算的是等号(=)左边的部分,然后是右边的部分。因此,当你写下 a += (a = 4);
,这等同于 a = a + (a=4);
,这与 a = a + 4;
相同,对于变量b也是相同的。
英文:
In Java when assigning a value to a variable, the first thing that is calculated is the left part of the = sign and then the right. Therefore, when you write a += (a = 4);
which is equivalant to a = a + (a=4)
which is the same as a = a + 4
, same for b.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论