为什么 x == (x = y) 与 (x = y) == x 不同?
2022-08-31 06:03:36
请考虑以下示例:
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
true
这个问题与Java表达式中子表达式的计算顺序不同,因为Java表达式在这里绝对不是“子表达式”。它需要加载以进行比较,而不是“评估”。这个问题是特定于Java的,与通常为棘手的面试问题精心制作的牵强附会的不切实际的构造不同,该表达式来自一个真正的项目。它应该是比较和替换成语的单行替代品x
x == (x = y)
int oldX = x;
x = y;
return oldX == y;
它比x86 CMPXCHG指令更简单,值得在Java中使用更短的表达式。