考虑以下示例:
class Quirky {
public static void main(String[] args) {
int x = 1;
int y = 3;
System.out.println(x == (x = y)); // false
x = 1; // reset
System.out.println((x = y) == x); // true
}
}
我不确定 Java 语言规范中是否有一项规定加载变量的先前值以与右侧 (x = y
) 进行比较,按顺序用括号表示,应先计算。
为什么第一个表达式的结果为 false
,而第二个表达式的结果为 true
?我本来希望首先评估 (x = y)
,然后将 x
与自身 (3
) 进行比较并返回 真
。
这个问题不同于 order of evaluation of subexpressions in a Java expression因为 x
绝对不是这里的“子表达式”。它需要加载进行比较,而不是“评估”。这个问题是特定于 Java 的,表达式 x == (x = y)
不同于通常为棘手的面试问题而设计的牵强附会的不切实际的结构,它来自一个真实的项目。它应该是比较和替换习语的单行替换
int oldX = x;
x = y;
return oldX == y;
它比 x86 CMPXCHG 指令更简单,应该在 Java 中使用更短的表达式。
最佳答案
==
是二进制 equality operator .
The left-hand operand of a binary operator appears to be fully evaluated before any part of the right-hand operand is evaluated.
Java 11 Specification > Evaluation Order > Evaluate Left-Hand Operand First
关于java - 为什么 x == (x = y) 与 (x = y) == x 不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53749841/