考虑以下示例:
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中使用较短的表达式。
x = y
当然是相关的,并且会导致将副作用x
设置为的值y
。