好的,我正在阅读一些关于RedBlackTrees的代码。我注意到这一行" v1 = v2 = v3 = v4;"我理解像" v1 + = v2" (将v2添加到v1的当前值)和" v1 = v2" (创建从v2到v1的引用)等。
public void insert( AnyType item )
{
current = parent = grand = header;
但我对使用current = parent = grand = header的内存/引用中发生的事情感到好奇;
http://faculty.washington.edu/moishe/javademos/REDBlack/RedBTree.java
编辑:下午10:46
我还要等10分钟才能批准问题,对等女士和男士们抱歉。
答案 0 :(得分:3)
header
的参考值会分配给current
,parent
和grand
。基本上所有变量都指的是相同的东西。
顺便说一句,这种做法在现实生活中很常见。
考虑如果你有这样的代码会发生什么:
boolean flag = false;
if(flag = true) {
System.out.println("true");
} else {
System.out.println("false");
}
这里的输出为true
,因为这里真正发生的是赋值而不是比较。
答案 1 :(得分:2)
现在,所有4个引用都具有相同的标题值。
答案 2 :(得分:2)
正在发生的事情是,header
的值已分配给grand
的值,该值已分配给parent
的值,而current
又被分配给grand = header;
parent = grand;
current = parent;
。最后,4个变量保持相同的值;这个习惯用于快速将几个变量初始化为相同的值,它等同于:
current = (parent = (grand = header));
赋值从右到左进行,实际上问题中的表达式的评估如下:
return x = 42;
这是有效的,因为赋值运算符的结果实际上评估到指定的值,例如,这可以工作:
42
在最后一个代码段中,x
被分配到x
,然后返回{{1}}的值。
答案 3 :(得分:1)
声明current = parent = grand = header
等同于:
grand = header;
parent = grand;
current = parent;
除非这些是基本类型,否则它们都将指向并共享与header
相同的对象内存位置。
答案 4 :(得分:1)
从原始类型值分配从右到左分配的参考值。小例子:
boolean first = true;
boolean second = false;
if (second = first) {
...
}
您将进入阻止if
,因为值first
已分配给second
,然后JVM将检查是否second == true
。
如果你写
if (second == first) {
...
}
您不会因if
而输入second != first
阻止。这是不同的表达方式
答案 5 :(得分:1)
=
运算符返回刚分配的值并且是右关联的,所以
a = b = c = d;
相当于
a = (b = (c = d));
或
c = d;
b = c;
a = b;
请注意,=
会将值从右侧复制到左侧指定的位置。另请注意,“value”表示在Object
派生类型的情况下对实例的引用,而不是实例本身。