考虑以下示例:
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;
Java中,由于比x86 CMPXCHG指令更简单,因此应该使用更短的表达方式。
x = y
是非常相关的,会导致副作用,即将x
设置为y
的值。 - Louis Wasserman