编程语言
首页 > 编程语言> > Java赋值运算符执行

Java赋值运算符执行

作者:互联网

Java中,我理解赋值求值为右操作数的值,因此x ==(y = x)等语句的求值为true.

但是,此代码输出错误.

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

为什么是这样?在我的理解中,它首先评估(x = y),它将x的值赋值给x,然后返回y的值.然后评估x.equals(y),这应该是真的,因为x和y现在应该共享相同的引用,但相反,我得到了假.

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

这里发生了什么?

解决方法:

首先:这是一个有趣的问题,但绝不应该出现在“真正的代码”中,因为即使你知道它是如何工作的,分配你在同一行中调用的变量也会让人感到困惑.

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

>找出调用该方法的对象(即评估第一个x,这将导致对字符串“hello”的引用)
>弄清楚参数(即评估x = y,这将改变x指向字符串“goodbye”并返回对该字符串的引用)
>使用#2的结果作为参数调用方法等于#1的结果(分别将引用字符串“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行的结果调用等于.

标签:java,string,assignment-operator,equals
来源: https://codeday.me/bug/20190910/1800966.html