java - 为什么 x == (x = y) 与 (x = y) == x 不一样?

标签 java variable-assignment equality operator-precedence jls

考虑以下示例:

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) 进行比较并返回


这个问题不同于 order of evaluation of subexpressions in a Java expression因为 x 绝对不是这里的“子表达式”。它需要加载进行比较,而不是“评估”。这个问题是特定于 Java 的,表达式 x == (x = y) 不同于通常为棘手的面试问题而设计的牵强附会的不切实际的结构,它来自一个真实的项目。它应该是比较和替换习语的单行替换

int oldX = x;
x = y;
return oldX == y;

它比 x86 CMPXCHG 指令更简单,应该在 Java 中使用更短的表达式。

最佳答案

== 是二进制 equality operator .

The left-hand operand of a binary operator appears to be fully evaluated before any part of the right-hand operand is evaluated.

Java 11 Specification > Evaluation Order > Evaluate Left-Hand Operand First

关于java - 为什么 x == (x = y) 与 (x = y) == x 不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53749841/

相关文章:

java - 使用 Java 从无效的 SOAP 1.1 消息中获取值(value)

java - 在水平模式下创建一个数字选择器,android :orientation ="horizontal" work? 我试过但数字选择器在垂直模式下仍然相同

java - 在没有 Intent 的情况下在android中发送邮件

r - 将 S4 R 对象分配给矩阵 : why does this work?

java 将 next() 分配给字符串或分成字符

java - 哪个 Java 库提供 base64 编码/解码?

c - 在以下情况下多重分配如何工作?

c# - 为什么 Object.Equals() 在从不同的程序集实例化时对相同的匿名类型返回 false?

python - 具有 NaN 相等性比较的 Pandas DataFrames

c - C中的这两个表达式是否相等?