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

相关推荐
我命由我123452 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
武子康4 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
PAK向日葵5 小时前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
_Kayo_7 小时前
VUE2 学习笔记6 vue数据监测原理
vue.js·笔记·学习
YuTaoShao7 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw7 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨7 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
双力臂4048 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空8 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
QQ_4376643149 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++