多重分配意外的輸出考慮用於與陣列
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]
爲零。
多重分配意外的輸出考慮用於與陣列
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]
爲零。
因爲a[a[b]]
是一樣a[0]
,你是爲分配值2 ..
b = 2, a[b] = 0 so a[a[b]] = 2
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
讓我們來看看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]
我想你正在讀
一個[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;
我想這線程可能會幫助你理解Java中的評估順序: What are the rules for evaluation order in Java?
這個問題的最重要的部分是第一=
是實際的分配。在java中,索引總是在評估時評估,因此a[a[b]]
是評估順序中的第一個索引。此時a[b]
爲0
。
摘自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
爲什麼你會有這樣的代碼?任何有三個任務的陳述是一個壞主意...... –
@Pshemo:很棒的地方,並且重複的答案是非常好的。 – Bathsheba
@Bathsheba所有學分都歸功於TheEnd。他找到了並在他的回答中發佈了鏈接。我只是將它標記爲重複。 – Pshemo