gpt4 book ai didi

Java赋值运算符执行

转载 作者:IT老高 更新时间:2023-10-28 11:50:30 26 4
gpt4 key购买 nike

在 Java 中,我知道赋值会计算为正确操作数的值,因此像 x == (y = x) 这样的语句会计算为 true

但是,此代码输出 false

public static void main(String[]args){
String x = "hello";
String y = "goodbye";
System.out.println(x.equals(x = y));
}

这是为什么?在我的理解中,它首先评估(x = y),它为xy的值,然后返回的值>y。然后 x.equals(y) 被评估,它应该是 true 因为 xy 应该共享相同的现在引用,但相反,我得到 false

Screenshot showing the source and that the output is "false"

这里发生了什么?

最佳答案

首先:这是一个有趣的问题,但永远不应该出现在“真实代码”中,因为即使你知道它是如何工作的,你在同一行中调用的变量也会令人困惑。

这里发生的是这三个步骤:

  1. 找出在哪个对象上调用方法(即评估第一个 x,这将导致对字符串“hello”的引用)
  2. 找出参数(即评估 x = y,这将改变 x 以指向字符串“再见”并返回对该字符串的引用)
  3. 使用#2 的结果作为参数调用#1 的结果equals 方法(将分别引用字符串“hello”和“goodbye”)。

查看为该方法生成的字节码会很清楚(假设您精通 Java 字节码):

     0: ldc           #2                  // String hello
2: astore_1
3: ldc #3 // String goodbye
5: astore_2
6: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
9: aload_1
10: aload_2
11: dup
12: astore_1
13: invokevirtual #5 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
16: invokevirtual #6 // Method java/io/PrintStream.println:(Z)V
19: return

第 9 行是上面的第 1 步(即计算 x 并记住该值)。

第 10-12 行是第 2 步。它加载 y,复制它(一次用于赋值,一次用于赋值表达式的返回值)并将其分配给 x.

第 13 行对第 9 行计算的结果和第 10-12 行的结果调用 equals

关于Java赋值运算符执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50970043/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com