x == (x = y) 与 (x = y) == x 不同?
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 中,计算顺序是从左到右,与括号无关。括号确定子表达式边界的位置,而不是计算的顺序。
- 括号仅在算术表达式中发挥主要作用,而不是在比较表达式中。
- 运算符的规则==是:计算左侧产生一个值,计算右侧产生一个值,比较这些值,比较结果就是表达式的值。评估左侧的所有规则都发生在评估右侧的所有规则之前。
堆栈角度
- 系统使用堆栈来计算表达式。表达式从左到右进行计算。
int x = 1;
int y = 3;
System.out.println(x == (x = y)); // false
首先 x(1) 将被推入堆栈。然后将对内部 (x = y) 进行求值并将其推送到值为 x(3) 的堆栈。现在 x(1) 将与 x(3) 进行比较,因此结果为 false。
x = 1; // reset
System.out.println((x = y) == x); // true
这里,(x = y) 将被求值,现在 x 值变为 3,并且 x(3) 将被推送到堆栈。现在,相等后值发生变化的 x(3) 将被推入堆栈。
3 == x
3 == 3
现在将对表达式进行求值,两者相同,因此结果为 true。
原文链接