在 Java 中,(a == (a = b)) 会产生未定义的行为吗?

问题描述 投票:0回答:1

正在学习Java,对赋值操作的返回值的属性有疑问。我知道 Java 在

x = y
中赋值后返回变量的值,但是这个赋值是什么时候发生的:在涉及赋值的整个表达式之前还是之后?它是在 Java 中定义的,无论是在表达式
a == (a = b)
中,变量的值在before 比较导致
true
之前被修改,或者如果,表达式给出一个等于
a == b
的值,而是赋值
 a
b
之后?

我知道

a == (a++)
true
a = (++a)
导致
false
- 这里它确实稍后执行一元增量,即使存在括号。

int a = 2;
System.out.println(a == (a = 2*a+1));
System.out.println(a);

这确实产生了

false
5

作为输出,类似于一元增量的行为。对于我的编译器来说只是这样,还是这种行为实际上是用

=
操作定义的?

java variable-assignment assignment-operator
1个回答
3
投票

这是由JLS 15.7.1指定的。

二元运算符的左手操作数似乎在右手操作数的任何部分被求值之前被完全求值。

==
是一个二元运算符,因此
a
总是在 任何部分
a = 2 * a + 1
被评估之前被完全评估。

© www.soinside.com 2019 - 2024. All rights reserved.