考虑下面的例子:
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表达式中子表达式的求值顺序不同,因为x
在这里绝对不是“子表达式”。它需要加载进行比较,而不是被“求值”。这个问题是java特有的,表达式x == (x = y)
不同于通常为棘手的面试问题而设计的牵强的不切实际的构造,它来自一个真实的项目。它应该是比较-替换习惯用法的一行替换
int oldX = x;
x = y;
return oldX == y;
它比x86的CMPXCHG指令更简单,在Java中应该有更短的表达式。