2014-03-25 49 views
4

多重分配意外的輸出考慮用於與陣列

int b = 2; 

int[] a = new int[4]; 

a[a[b]] = a[b] = b = 2; 

for (int i = 0; i <= 3; i++) 
{ 
    System.out.println(a[i]); 
} 

輸出是

2 
0 
2 
0 

我期待a[0]爲零。

+4

爲什麼你會有這樣的代碼?任何有三個任務的陳述是一個壞主意...... –

+0

@Pshemo:很棒的地方,並且重複的答案是非常好的。 – Bathsheba

+0

@Bathsheba所有學分都歸功於TheEnd。他找到了並在他的回答中發佈了鏈接。我只是將它標記爲重複。 – Pshemo

回答

1

因爲a[a[b]]是一樣a[0],你是爲分配值2 ..

b = 2, a[b] = 0 so a[a[b]] = 2 
1

a[a[b]] = a[b]=b=2,該執行從左側

首先

a[a[b]] i.e, a[a[2]] -> a[0] //initially the value of a[2] will be 0 

現在,

a[0]=a[2]=b=2; 

所以輸出,

2 0 2 0 
0

讓我們來看看a[a[b]] = a[b]=b=2;做詳細:

a[a[b]]:b爲2 a[2]爲0,a[a[2]]a[0]

所以a[a[b]] = a[b]=b=2;被評估以a[0] = a[b]=b=2;

被評價爲a[0] = a[2] =2;,所以a[2]是2和a[0]等於a[2]

0

我想你正在讀

一個[A [B]] = a [b] = b = 2;

從右到左,並期待在每一步重新評估數組和b,而實際上它似乎在分配時凍結了a和b。考慮等效代碼:

1) int b = 2;   

//array initialized to 0 
2) int[] a= new int[4]; // 0 0 0 0 

// at this point a[b] is a[2] = 0, therefore below a[a[b]]=2 is equivalent to a[0]=2 
3) a[a[b]] = 2   // 2 0 0 0  

// the same: a[b] = 2 is equivalent to a[2] = 2 -note that the arrays are zero based 
4) a[b]= 2    // 2 0 2 0 

5) b=2; 
1

我想這線程可能會幫助你理解Java中的評估順序: What are the rules for evaluation order in Java?

這個問題的最重要的部分是第一=是實際的分配。在java中,索引總是在評估時評估,因此a[a[b]]是評估順序中的第一個索引。此時a[b]0

2

摘自JLS 15.26.1。簡單賦值運算符=

如果左邊的操作數是一個數組訪問表達式(§15.13), 可能封閉在一對或多對括號的,則:

首先,數組引用子表達式評估數組訪問表達式的左側操作數 。如果此評估突然完成 ,則賦值表達式將以相同的原因突然完成; (左側操作數數組 訪問表達式)的索引子表達式和右側操作數不會被評估,也不會發生任何 分配。

這意味着a[a[b]]評估爲a[0],因爲它首先被評估。然後,我們按照a[0] = a[b] = b = 2的順序進行操作,任務從右向左進行。

請參閱http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.1