-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]++;
    }
}
4

4 回答 4

4

数组实际上是变量的集合 - 因此数组访问表达式引用一个变量,根据JLS 的第 15.13 节

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

...

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

由于它是一个变量,它可以正常递增 - 或用于复合赋值表达式,例如

x[i] += 10;

在底层字节码中,这转化为本地加载/修改/存储指令。

于 2013-10-10T21:24:00.030 回答
3
for (int j = 0; j < tmpArr.length; j++) {
        tmpArr[i]++;
}

您将i索引 ( 1) 增加 3 次。您没有触摸 index0或 index 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]++;
}

会解决的。

于 2013-10-10T21:22:03.563 回答
1

看看你实际增加值的循环:

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

您不断增加 tmpArr[i],即 tmpArr[1],而不是 tmpArr[j],因此第二个值增加了 3 倍,而其他值根本不增加。

于 2013-10-10T21:24:02.070 回答
1

tmpArr[i]++等于tmpArr[i] += 1- 将存储在 tmpArr[i] 中的值加一

于 2013-10-10T21:24:14.377 回答