语法"变量=变量=变量;"发生了什么?

时间:2012-05-29 10:39:47

标签: java variables red-black-tree

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

6 个答案:

答案 0 :(得分:3)

header的参考值会分配给currentparentgrand。基本上所有变量都指的是相同的东西。

顺便说一句,这种做法在现实生活中很常见。

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

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派生类型的情况下对实例的引用,而不是实例本身。