2013-10-10 64 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]