循环退出后为什么for / while循环变量递增1?不必要的副作用

时间:2012-11-08 13:33:49

标签: java

这是代码 -

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的操作。在我看来,这使得代码更难理解。

有更好的解决方案吗?

7 个答案:

答案 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)

如果您知道操作顺序

,这非常简单
  • STEP_1 - 身体操作前的动作。
  • SETP_2 - 如果为true,则评估继续操作的逻辑表达式。
  • STEP_3 - 执行身体操作。
  • STEP_4 - 身体操作后的动作。

所以:

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);