2011-12-04 124 views
24

爲什麼在這個例子中的輸出是?Java數組 - 爲什麼輸出爲'1'?

public static void main(String[] args){ 
int[] a = { 1, 2, 3, 4 }; 
int[] b = { 2, 3, 1, 0 }; 
System.out.println(a [ (a = b)[3] ]); 
} 

我認爲這將是。即,表達被評價爲:

a[(a=b)[3]] 
a[b[3]] //because a is now pointing to b 
a[0] 

如果不是[0]是因爲一個指向b

在此先感謝。

+3

男人,C有這非常簡單的「未定義的行爲」的事情! – Kos

+2

奇怪的學習+1! –

+1

這些是一些Java測試或面試者想要問的問題,即使沒有人理智也會寫這樣的代碼。 – GreenieMeanie

回答

16

這weirded我出去,以及...但是,檢查節15.7.1在here

從本質上講,由左到右的操作數進行評估。但是請注意:

建議代碼不要嚴格依賴於此規範。當每個表達式至多包含一個副作用時,代碼通常會更清晰,作爲其最外層操作,並且代碼並不完全依賴於由表達式的從左到右的評估導致出現哪種異常。

+1

我一直認爲括號首先被評估 - BODMAS – ziggy

26

每個運算符的參數從左到右進行評估。即,在[...]之前的a在其內容之前被評估,此時它仍然指向第一個數組。

7
a [ (a = b)[3] ]) 

解釋如下:

a = b => a = {2, 3, 1, 0}; 
(a = b)[3] => 0; 

這裏是這裏的竅門:a被評估爲b前值分配給它。

a[(a = b)[3]) => a[0] = 1; 

想想Java中的運算符優先級。它應該更明顯一點。

+0

-1:OP詢問了爲什麼,你只是表明當你重新排序指令時可能得到1 ... – Betlista

2

正如Marcelo Cantos先生所指出的,對每個操作員的爭論從左到右進行評估。因此這裏是我認爲執行是

a[(a=b)[3]] 

這裏外「A」將獲取「1,2,3,4」,然後其參數(A = B)[3]求值。因此,現在a = b並返回b數組中索引爲3的元素,這也是a指向的元素。

因此,我們從參數評估中得到'0'。如前所述,外a仍然指舊內容因此在1,2,3,4數組中給出了一個[0]。

因此我們得到'1'。

這是我的理解。請讓我知道如果它錯了。

謝謝,