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。
原文链接

相关推荐
.痞老板.37 分钟前
java ee--多线程(进阶)
java·java-ee
2603_969694851 小时前
【JavaWeb学习记录】MyBatis核心知识点与实战笔记:从入门到动态SQL
笔记·sql·学习·mysql·mybatis·javaweb·学习方法
可乐ea1 小时前
智能体记忆该拆成几层:笔记、记忆表示与注入上下文
服务器·数据库·笔记·ai智能体·提示词工程·上下文工程·记忆系统
深入云栈2 小时前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构
聪明的笨猪猪3 小时前
企业知识库AI架构选型:落地导向的架构决策与组件清单
经验分享·面试·架构·embedding·数据库架构
wang_shu_mo_ran3 小时前
MyBatis 从入门到进阶(一)
java·spring·mybatis
量化分析码农5 小时前
股票历史数据的复权参数对照:多级别返回的字段与数值差异
java·javascript·后端
Go Work5 小时前
两个等值条件摆着,MySQL 偏要全表扫
经验分享·笔记
猫猫不是喵喵.5 小时前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
瑞雪兆丰年兮5 小时前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop