数组奇怪的后缀评估

时间:2013-10-10 21:19:48

标签: java

我创建了一个基元数组,如果我执行 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]++;
    }
}

4 个答案:

答案 0 :(得分:4)

数组实际上是变量的集合 - 所以数组访问表达式引用一个变量,如section 15.13 of the JLS所示:

  

数组访问表达式是指作为数组组件的变量。

     

...

     

数组访问表达式的结果是T类型的变量,即由索引表达式的值选择的数组中的变量。

因为它是一个变量,它可以正常递增 - 或者在复合赋值表达式中使用,例如。

x[i] += 10;

在基础字节代码中,这转换为本地加载/修改/存储指令。

答案 1 :(得分: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)。

您使用iArr[0]方法直接递增incr,因此我不确定您希望它打印0而不是1。我不明白为什么你期望tmpArr成为{1,2,3}。我可以看到您希望tmpArr成为{2, 3, 4},如果是这样,那么:

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

将解决这个问题。

答案 2 :(得分:1)

查看实际递增值的循环:

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

你经常增加tmpArr [i],即tmpArr [1],而不是tmpArr [j],因此第二个值增加三次,而其他值则不增加。

答案 3 :(得分:1)

tmpArr[i]++等于tmpArr[i] += 1 - 将存储在tmpArr [i]

中的值加1