Java - 同时将两个表达式赋值给一个变量

4
我刚刚完成了Java的第一年学习,并且作为练习,我一直在查看JDK源代码。
我发现了一些以前从未遇到过的事情,在同一条语句中将同一个变量赋值了两次。
例如, variable = expression = expression;
这里到底发生了什么?这是一件相当常见的事情吗?双重赋值的目的是什么?
非常感谢。 -Mike

1
如果您已经发布了示例,那么回答会更容易... - Petar Minchev
这可能吗?变量 = otherVariable = 表达式会有意义。 - willcodejavaforfood
看到标题后,我以为这是一个互斥锁的问题 :] - frbry
@Petar - 我在想更多的是 x = y = 3; - willcodejavaforfood
@willcodejavaforfood 我明白了,我已经删除了我的评论 :) - Petar Minchev
5个回答

6
variable1 = variable2 = expression;

可以写成:
variable2 = expression;
variable1 = variable2;

这是因为等号在其他操作都被评估之后,从右到左进行评估(基本上是按运算顺序的最低运算)。
这通常被视为俗气的做法,我不建议这样做。

3
我想你的意思是:

我猜你是指


variable1 = variable2 = expression;

在这种情况下,表达式将被分配给两个变量。
这可以写成:
variable1 = expression;
variable2 = expression;

所以你可以使用你提出的样式来使代码更短,更优雅。


5
它并不更加优雅。让代码变短并不总是一件好事。 - Qwerky
1
我认为在原始代码中,该表达式仅被计算一次。但在你的修改中,它将被计算两次。 - Don Roby
Qwerky,我同意你的观点,缩短代码并不总是好事。但在这种情况下,对我来说,它很优雅。就我而言 :) - Andriy Sholokh
1
对于你来说好不好用并不那么重要,比起五年后维护代码的可怜家伙来说,什么更好才是最重要的。 - Qwerky

1

这是因为在Java中,赋值语句有一个返回值(左表达式的结果)!

在循环中使用它非常有用,比如当你读取字节数组文件时:你可以跟踪读取的字节数,并知道何时文件结束:

InputStream is=......
byte[] b=new byte[1024];
int read;
for(;read=is.read(b)>0;){
    //do stuff knowing how many bytes hav been readed
}

1

你不能同时将两个表达式赋值给同一个变量。

variable = 3 = 2;

这段代码无法编译。也许你看到的是这样的:

variable = x = 3;

在这种情况下,实际上是variable = variable = expression,它将同一个表达式分配给了两个变量。这是可能的,因为赋值操作的值就是被赋的值。所以在这种特定情况下,x = 3首先被执行,并且其值为3,然后被分配给variable


0

这是合法的,但通常不鼓励使用。即使Sun's standard也建议避免使用。

编辑:
像其他人一样,我假设你的意思是variable1 = variable2 = expression;


Java标准对于一行中有多个独立语句的规定是怎样的?在我们的情况下,略有不同。 - Andriy Sholokh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接