这是代码 -
int i = 0;
System.out.printf( "\n%d\n\n", i ); // show variable i before loop
for( i = 0; i < 8; i++ )
{
System.out.printf( "%d\t", i );
}
System.out.printf( "\n\n%d\n", i ); // show variable i after loop
这是输出 -
0
0 1 2 3 4 5 6 7
8
当我想在for循环退出后使用变量i时出现问题。我会假设我正在阅读7,基于零的计数中的第8个增量,但它实际上读为8!循环退出已经对变量i增加了一个增量。
为了解决这个问题,我必须在循环结束时以及在任何其他代码中使用它之前做类似i的操作。在我看来,这使得代码更难理解。
有更好的解决方案吗?
答案 0 :(得分:13)
当i
为7时,条件i < 8
仍然有效,因此没有理由退出循环。
在循环之前声明循环变量并且之后使用它并不是很清楚。相反,考虑使用循环语句声明循环变量。
int numIterations = 8;
for(int i = 0; i < numIterations; i++) {
// ...
}
// continue doing something with numIterations, or numIterations-1
如果使用numIterations-1
确实困扰您,您也可以使用int maxCounter = 7
并使用i <= maxCounter
代替循环不变。
答案 1 :(得分:3)
当你说
时for( i = 0; i < 8; i++ )
中间部分i < 8
是循环不变:只要它成立,就会有下一次迭代。因此,一旦离开循环,它就因为不变量不再而i
不能小于8。
答案 2 :(得分:2)
如果您想要更容易阅读的内容,请执行以下操作:
int start = 0;
int end = 7;
System.out.printf( "\n%d\n\n", start );
for(int i = start; i <= end; i++ )
{
System.out.printf( "%d\t", i );
}
System.out.printf( "\n\n%d\n", end );
答案 3 :(得分:2)
循环在i == 8
时退出,因为循环条件表示:只要i < 8
继续迭代。或者换句话说:在i >= 8
时停止迭代。
因此,循环中的最后一个i++
会将8
分配给i
,退出循环。这解释了您获得的结果,并且它们符合预期。也许你错误地认为在退出循环之前没有执行最后的i++
。
要获得所需的行为,请尝试相反 - 代码的意图更清晰:
int i = 0;
int iterations = 8;
System.out.printf( "\n%d\n\n", i );
while (i < iterations) {
System.out.printf( "%d\t", i );
i++;
}
System.out.printf( "\n\n%d\n", --i );
答案 4 :(得分:1)
这是正确的,否则它永远不会退出,因为7 < 8
。
在这段代码中添加更多逻辑当然没用,因为你已经知道在循环结束时变量总是相同的。我认为你需要在带有条件语句的更复杂的代码中使用它,所以在这种情况下你可以这样做:
int i = 0;
System.out.printf( "\n%d\n\n", i ); // show variable i before loop
for( i = 0; i < 8; i++ )
{
if ( i == 3 ) // just for example
break;
System.out.printf( "%d\t", i );
}
System.out.printf( "\n\n%d\n", i ); // show variable i after loop
这将打印:
0
0 1 2 3
3
答案 5 :(得分:1)
如果您知道操作顺序
,这非常简单所以:
for(STEP_1; STEP_2; STEP_4) {
STEP_3
}
通常在步骤1中我们初始化变量,在步骤4中我们修改它以进行下一次循环评估。
int i = 0;
for(; i< 8; i++) {
}
循环在i == 8
时中断,就像在循环之前声明的值一样。
答案 6 :(得分:0)
在循环中,变量i递增,直到达到8或更大,此时条件触发离开循环。
这就是它的工作方式。
所以你有两个我能想到的选择。
在循环后从变量i中减去一个。
在循环中放置一个if语句,这样当i等于7时,它就会中断。
for (i = 0; i < 8; i++) {
if (i == 7) break;
}
另一个选择是使用do while,如:
i = -1;
do {
i++; // increment i so that it is at the correct current value starting with zero
// loop stuff
} while (i < 7);