2012-05-29 53 views
2

好吧,我正在閱讀一些關於RedBlackTrees的代碼。我注意到這一行「v1 = v2 = v3 = v4;」我的理解是這樣「V1 + V2 =」(添加V2到V1的電流值)和「V1 = V2」(從創建到V2 V1參考)等語法「variable = variable = variable;」發生了什麼?

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分鐘就批准問題,遺憾的等待女士,先生們。

+1

應該指出的是,代碼應該被認爲是一個概念驗證或演示,但它*絕對不是*生產質量證明。例如'current'(和相關的字段)應該在使用它們的方法中真的是局部變量。 –

+0

是啊我只是讓我的腦袋周圍怎麼回事,所以我可以實施清除方法(哈哈),謝謝! :) – Killrawr

回答

2

發生了什麼事是,header值分配給被分配給輪流被指派給current的的parent值的grand值。最後,這4個變量保持相同的值;這個成語用來快速初始化幾個變量的值相同,它的等效於此:

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

從右到左,其實在這個問題表達是這樣評價出現的分配:

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

這工作,因爲賦值運算符的結果卻評估到所分配的值,例如這個工程:

return x = 42; 

在上面的代碼片段中,42被分配到x,然後返回值x

+0

謝謝! +1 rep :) – Killrawr

3

將參考值header分配給current,parentgrand中的每一個。基本上所有的變量都會引用相同的事物。

順便說一句,這種做法在現實生活中經常被忽視。

考慮,如果你有這樣的代碼會發生什麼:

boolean flag = false; 

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

輸出將true這裏什麼是真正發生在這裏是一個分配而非比較

+0

謝謝! :) ..第一次看到這種參考。 :) +1 rep – Killrawr

+0

在條件語句中賦值與鏈接賦值有什麼關係......? – BoltClock

+1

@BoltClock閱讀第一句,條件語句是關於變量賦值的概念。 (從我的理解):) – Killrawr

2

所有4個引用現在具有相同的標頭值。

+0

Brillant!謝謝:)我對發生了什麼事感到困惑。 +1 rep – Killrawr

1

聲明current = parent = grand = header等同於:

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

除非這些類型的原語,他們都將指向和共享相同的對象存儲位置爲的header

+0

感謝您花費一些時間回答+1代表 – Killrawr

1

參考值從右到左分配,在原始類型中賦值。小例子:

boolean first = true; 
boolean second = false; 

if (second = first) { 
    ... 
} 

你將進入塊if因爲價值first被分配到second,然後JVM會檢查是否second == true

如果你寫

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

你不會進入if塊,因爲second != first。這是不同的表達

+0

謝謝!花時間回答:) +1 rep – Killrawr

1

=運算符返回它剛分配的價值,是對聯想,所以

a = b = c = d; 

相當於

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

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

注意=將右側的值複製到由左側指定的位置。還要注意,「值」是指在Object衍生類型的情況下對實例的引用,而不是實例本身。

+0

感謝wormbo +1 – Killrawr

相關問題