2

好的,我正在阅读一些关于 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 分钟才能批准问题,对不起等待的女士们和先生们。

4

6 回答 6

3

的参考值header被分配给current,parent和中的每一个grand。基本上所有的变量都指向同一个东西。

顺便说一句,这种做法在现实生活中的编程中经常不受欢迎。

考虑一下如果你有这样的代码会发生什么:

boolean flag = false;

if(flag = true) {
    System.out.println("true");
} else {
    System.out.println("false");
}

输出将在true这里,因为这里真正发生的是assignment而不是comparison

于 2012-05-29T10:41:08.247 回答
2

现在所有 4 个引用都具有相同的 header 值。

于 2012-05-29T10:41:12.750 回答
2

发生的事情是将 的值header分配给 的值grand分配给 的值parent依次分配给current。最后,4 个变量保持相同的值;这个习惯用法用于快速将多个变量初始化为相同的值,它等价于:

grand = header;
parent = grand;
current = parent;

赋值从右到左进行,实际上问题中的表达式是这样计算的:

current = (parent = (grand = header));

这是有效的,因为赋值运算符的结果实际上计算为分配的值,例如这有效:

return x = 42;

在最后一个片段中,42被分配给x然后x返回的值。

于 2012-05-29T10:41:31.447 回答
1

=运算符返回它刚刚分配的值并且是右关联的,所以

a = b = c = d;

相当于

a = (b = (c = d));

或者

c = d;
b = c;
a = b;

请注意,=将右侧的值复制到左侧指定的位置。另请注意,“值”表示在Object衍生类型的情况下对实例的引用,而不是实例本身。

于 2012-05-29T10:51:29.930 回答
1

该语句current = parent = grand = header等效于:

grand = header;
parent = grand;
current = parent;

除非这些是原语类型,否则它们都将指向和共享相同的对象内存位置header

于 2012-05-29T10:45:36.577 回答
1

从右到左分配的参考值,在原始类型中分配值。小例子:

boolean first = true;
boolean second = false;

if (second = first) {
    ...
}

您将进入阻塞if,因为值first已分配给second,然后 JVM 将检查是否second == true

如果你写

if (second == first) {
    ...
}

您不会进入if阻止,因为second != first. 那是不同的表达方式

于 2012-05-29T10:46:08.883 回答