2013-10-10 61 views
-1

我已經創建了一個基元數組,如果我執行arr [index] ++,那麼足夠奇怪我的數組內容正在被修改。有人可以解釋爲什麼數組的內容正在被修改。我也貼這說明了什麼問題示例代碼:
數組奇怪的後綴評估

ExpectedOutput iArr[0] = 0 , tmpArr = [1, 2, 3] 

ActualOutput iArr[0] = 1 , tmpArr = [1, 5, 3] 

樣品等級:

class ArrayTest { 
    public static void main(String args[]) { 
     int i = 1; 
     int[] iArr = { 0 }; 

     incr(iArr); 

     System.out.println("iArr[0] = " + iArr[0]); 

     int[] tmpArr = {1, 2, 3}; 

     for (int j = 0; j < tmpArr.length; j++) { 
      tmpArr[i]++; 
     } 


     System.out.println("tmpArr = " + Arrays.toString(tmpArr)); 

    } 

    public static void incr(int[] n) {    
     n[0]++; 
    } 
} 
+0

你會希望它做的,而不是增值? –

回答

4

陣列是有效的變量集合 - 這樣的陣列訪問表達式是指一個變量,按照section 15.13 of the JLS

數組訪問表達式是指一個變量,它是一個陣列的組成部分。

...

陣列訪問表達式的結果是類型T,即由索引表達式的值所選擇的陣列中的變量的變量。

因爲它是一個變量,所以它可以像正常那樣遞增 - 或者用於複合賦值表達式,例如,

x[i] += 10; 

在底層字節代碼中,這轉換爲本地加載/修改/存儲指令。

3
for (int j = 0; j < tmpArr.length; j++) { 
     tmpArr[i]++; 
} 

你遞增i指數(1)的3倍。您沒有觸及索引0或索引2

所以你原來的數組是{1, 2, 3},你的最終數組是{1, 5, 3},(提示:2 + 3 = 5)。

您用incr方法直接遞增iArr[0],所以我不確定爲什麼您期望它打印0而不是1。我不明白你爲什麼期望tmpArr{1,2,3}。我可以看你怎麼指望tmpArr{2, 3, 4},如果是這樣的話,那麼:

for (int j = 0; j < tmpArr.length; j++) { 
     tmpArr[j]++; 
} 

將解決這個問題。

+0

有道理,你能否也提一下爲什麼iArr [0]打印1 – sol4me

+0

編輯我的答案。也許你需要詳細說明爲什麼你期望'iArr [0]'打印除了'1'之外的任何東西。 – nhgrif

1

看一看在循環中,你實際上會增加值:

for (int j = 0; j < tmpArr.length; j++) { 
    tmpArr[i]++; 
} 

你不斷加大tmpArr [I],這是tmpArr [1],而不是tmpArr [J],因此第二值增加了三次,其他的根本沒有增加。

1

tmpArr[i]++等於tmpArr[i] += 1 - 通過一個存儲在tmpArr [I]