x == (x = y) 与 (x = y) == x 不同?【Java 面试题】

x == (x = y) 与 (x = y) == x 不同?

java 复制代码
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 中,计算顺序是从左到右,与括号无关。括号确定子表达式边界的位置,而不是计算的顺序。
  • 括号仅在算术表达式中发挥主要作用,而不是在比较表达式中。
  • 运算符的规则==是:计算左侧产生一个值,计算右侧产生一个值,比较这些值,比较结果就是表达式的值。评估左侧的所有规则都发生在评估右侧的所有规则之前。

堆栈角度

  • 系统使用堆栈来计算表达式。表达式从左到右进行计算。
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。

java 复制代码
x = 1; // reset
System.out.println((x = y) == x); // true

这里,(x = y) 将被求值,现在 x 值变为 3,并且 x(3) 将被推送到堆栈。现在,相等后值发生变化的 x(3) 将被推入堆栈。

java 复制代码
3 == x
3 == 3

现在将对表达式进行求值,两者相同,因此结果为 true。
原文链接

相关推荐
Emily15685359870几秒前
Emerson 1C31129G03 Analog Input Module
java·开发语言·前端·plc·emerson·1c31129g03·input module
就叫_这个吧5 小时前
Java递归方法实现面包屑导航
java·开发语言
To_OC5 小时前
面试被问了三回三栏布局,这次我终于把 BFC 那层窗户纸捅破了
前端·css·面试
fīɡЙtīиɡ ℡5 小时前
AI 应用系统设计
java·开发语言·人工智能
城管不管5 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
码匠许师傅5 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
To_OC5 小时前
啃完 TS 工具类型我发现:Pick 和 Omit 原来就是一层窗户纸
前端·面试·typescript
AI绘画哇哒哒5 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
最强小杰6 小时前
gpt-5.6-sol 频繁报 503 怎么办?区分容量熔断和限速 429 的排查方法 + 可复用 retry wrapper
java·人工智能·gpt·ai
liuyicenysabel7 小时前
多服务上线日记三:
运维·服务器·笔记·学习