我创建了一个基元数组,如果我执行 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;
在基础字节代码中,这转换为本地加载/修改/存储指令。
答案 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]