【发布时间】:2009-12-15 12:35:02
【问题描述】:
我用 i 作为计数器变量创建了一个循环。
在该循环中,我正在比较数组的单元格。
我想知道 array[i++](或 array[++i])与 array[i+1] 之间有什么区别。
因为 i++(或 ++i)不能以想要的方式工作,而 i+1 可以(一个让我发疯的小包)。
提前致谢。
【问题讨论】:
标签: java
我用 i 作为计数器变量创建了一个循环。
在该循环中,我正在比较数组的单元格。
我想知道 array[i++](或 array[++i])与 array[i+1] 之间有什么区别。
因为 i++(或 ++i)不能以想要的方式工作,而 i+1 可以(一个让我发疯的小包)。
提前致谢。
【问题讨论】:
标签: java
array[i++] 将评估 array[i] 并增加 i。array[++i] 将增加 i 并且 然后 评估 array[i](因此它会为您提供下一个元素)array[i+1] 会给你下一个元素而不增加 i
就我个人而言,我尽量避免使用这样的副作用 - 这意味着当我稍后阅读代码时,我总是必须放慢速度以确保我以正确的顺序获得所有内容。
如果您已经处于递增i 的循环中,那么在数组访问表达式中递增i 将意味着每次循环迭代都会递增i 两次。
【讨论】:
i++、++i 和 i+1 都是不同的表达式(或操作)。您应该查阅您最喜欢的 Java 参考资料以了解其中的区别。
(简而言之:i++递增i但返回原始值,++i递增i并返回新值,i+1不递增i但返回i+1的值.)
至于为什么你的循环没有按照你期望的方式工作:如果没有实际看到你的代码就无法回答——这很合乎逻辑。我的假设是您要么使用了错误的表达式和/或您在每个循环中增加了 i 两次。
【讨论】:
++i 时,i 会递增 1,并且它可能也会在循环中第二次递增。所以下次你使用它时,它会增加 2 而不是 1。 i+1 产生相同的值但不增加(i 的内容)。
array[i++] 将给您与array[i] 相同的值,然后增加i。 array[++i] 将为您提供与 array[i+1] 相同的值并增加 i。 array[i+1] 实际上不会改变 i 的值。
【讨论】:
i++:将i中存储的值加一,返回旧值。++i:将i中存储的值加一,返回新值。i+1:返回i和1之和,不改变i中存储的值
现在考虑一下,如果我怀疑你的代码看起来像
for ( i = 0; i < something; i++ )
{
dosomething(i++);
}
传递给dosomething() 的i 的值将是
0
2
4
8
.
.
由于循环的每次迭代,i 在for() 行中增加一次,在dosomething() 行中增加一次,并且dosomething() 调用被赋予i 在增加之前的值。如果实际需要的行为是使用序列调用 dosomething()
1
2
3
4
.
.
那么你需要避免更新i,结果是在循环体中添加1:
对于 ( i = 0; i
甚至
for ( i = 1; i < (something+1); i++ )
{
dosomething(i);
}
【讨论】:
array[i++] 表示“取索引为 i 的数组元素,然后递增 i”。
array[i+1] 表示“取索引为 i+1 的数组元素,不要修改 i”。
【讨论】:
无法正常工作,因为您在每个循环中将 i 递增两次。
因此,如果您的数组是 {1,2,3,4,5,6,7} 并且您从 i=0 开始打印 array[++i],它将打印“2,4,6”,然后抛出 ArrayOutOfBoundsExcpetion,如果数组是 {1,2,3,4,5,6,7,8},它将打印“2,4,6,8”
最好远离循环计数器上的++,除非你是认真的。
【讨论】:
让我们定义i=0,然后
i++ 将返回 0,然后将 i 增加到 1++i 将增加 i 到 1 然后返回 1ì+1 将不增加 i 并返回 1我假设,你不想自己增加 i,只加 1 以访问具有不同偏移量的索引。
【讨论】: