在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)
,这会将y
的值赋给x
,然后返回y
的值。然后计算x.equals(y)
,它应该是true
,因为x
和y
现在应该共享相同的引用,但我得到的是false
。
这是怎么回事?
发布于 2018-06-21 21:46:50
括号中的x=y
表示表达式(x=y)
现在为goodbye
,而x.equals
中的外部x保存值hello
发布于 2018-06-21 21:57:04
Reimus给出了正确的答案,但我想详细说明。
在Java (和大多数语言)中,约定是变量放在左边,赋值放在右边。
让我们来分析一下:
String x = "hello";
//x <- "hello"
String y = "goodbye";
//y <- "goodbye";
为了调试的目的和代码的可读性,一种好的做法是拆分您的行,使它们只做一件事。
System.out.println(x.equals(x = y)); //Compound statement
在这里,在对x的原始引用上调用x.equals(...)
,或者"hello",它针对第二个引用进行了更新。
我会这样写(这会给出你期望的答案):
x = y;
// x <- y = "goodbye"
boolean xEqualsX = x.equals(x);
// xEqualsX <- true
System.out.println(xEqualsX);
// "true"
现在这似乎是显而易见的,它应该这样做,但也很容易看到每一行中到底发生了什么,这是您应该努力实现的。
发布于 2018-06-23 03:05:10
我认为这个问题在外行术语中是"hello".equals("goodbye")
。所以它返回false。
https://stackoverflow.com/questions/50970043
复制相似问题