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

Arx*_*xel 1 java variable-assignment assignment-operator

我正在学习Java,我有一个关于赋值操作的返回值的属性的问题。我知道 Java 在 中 赋值之后返回变量的值x = y,但是这个赋值何时发生:在涉及赋值的整个表达式之前还是之后?它是在Java中定义的,是否在表达式中a == (a = b),变量的值在比较结果之前true修改,或者如果表达式给出了一个相当于的值a == ba然后 赋值b

我知道那a == (a++)truewhile 的a = (++a)结果false- 这里它确实稍后执行一元增量,即使存在括号。

int a = 2;
System.out.println(a == (a = 2*a+1));
System.out.println(a);
Run Code Online (Sandbox Code Playgroud)

这确实产生了

false
5
Run Code Online (Sandbox Code Playgroud)

作为输出,类似于一元增量的行为。我的编译器就是这样,还是这种行为实际上是通过=操作定义的?

Lou*_*man 7

JLS 15.7.1对此进行了规定。

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

==是二元运算符,因此a始终在评估 的任何部分之前对其进行完全评估a = 2 * a + 1