2

さて、私はRedBlackTreesに関するいくつかのコードを読んでいます。そして、この行「v1 = v2 = v3=v4;」に気づきました。そして、「v1 + = v2」(v1の現在の値にv2を追加する)や「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 PM

私はまだ質問を承認するために10分待たなければなりません、待っている女性と男性のために申し訳ありません。

4

6 に答える 6

3

の参照値は、、およびheaderのそれぞれに割り当てられます。基本的に、すべての変数は同じものを参照します。currentparentgrand

ちなみに、この慣習は実際のプログラミングではしばしば眉をひそめます。

次のようなコードがあるとどうなるか考えてみてください。

boolean flag = false;

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

trueここで実際に起こっているのは比較ではなく割り当てであるため、出力はここにあります。

于 2012-05-29T10:41:08.247 に答える
2

4つの参照すべてに、同じ値のヘッダーが含まれるようになりました。

于 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

このステートメント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) {
    ...
}

iffirstがに割り当てられているため、ブロックに入りsecond、JVMは。をチェックしますsecond == true

あなたが書くなら

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

ifのため、ブロックには入りませんsecond != first。それは別の表現です

于 2012-05-29T10:46:08.883 に答える
1

演算子は、割り当てたばかりの=値を返し、適切に関連付けられているため、

a = b = c = d;

と同等です

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

またはに

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

=値を右側から左側で指定された場所にコピーすることに注意してください。また、「値」はObject、インスタンス自体ではなく、派生型の場合のインスタンスへの参照を意味することに注意してください。

于 2012-05-29T10:51:29.930 に答える