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

In Java, does (a == (a = b)) produce undefined behaviour?

提问人:Arxel 提问时间:5/12/2023 最后编辑:Arxel 更新时间:5/12/2023 访问量:65

问:

我正在学习 Java,我对赋值操作的返回值的属性有疑问。我知道 Java 在赋值后返回变量的值,但是此赋值何时发生:在涉及赋值的整个表达式之前还是之后?它是否在 Java 中定义,无论是在表达式中,变量的值在比较之前被修改导致 ,还是表达式给出一个等价的值,而是在之后分配?x = ya == (a = b)truea == bab

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

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

这确实产生了

false
5

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

java 变量 值 赋值运算符

评论

0赞 Anonymous 5/12/2023
虽然不推荐,但您的代码以明确定义的方式运行。 首先计算为 2,然后计算 2 * 2 + 1 = 5 并将其赋值给 ,然后比较 2 和 5 并发现它们不相等,因此最终结果将始终为 ,并且之后始终具有值 5。它从左到右的评估得出。a == (a = 2*a+1)aafalsea

答:

7赞 Louis Wasserman 5/12/2023 #1

这是由 JLS 15.7.1 指定的。

在计算右操作数的任何部分之前,似乎对二元运算符的左操作数进行了完全评估。

==是一个二元运算符,因此在计算 的任何部分之前,始终会进行完全计算。aa = 2 * a + 1