3

这是代码 -

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

有更好的解决方案吗?

4

7 回答 7

13

i为 7 时,条件i < 8仍然满足,因此没有理由退出循环。

在循环之前声明循环变量并在之后使用它并不是很清楚。相反,请考虑使用循环语句声明循环变量。

int numIterations = 8;
for(int i = 0; i < numIterations; i++) {
    // ...

}
// continue doing something with numIterations, or numIterations-1

如果 usingnumIterations-1真的很困扰你,你也可以改为使用int maxCounter = 7和使用i <= maxCounter作为循环不变量。

于 2012-11-08T13:35:02.357 回答
3

当你说

for( i = 0; i < 8; i++ )

中间部分i < 8循环不变量:只要它成立,就会有下一次迭代。因此,一旦你离开循环,那是因为不变量不再成立并且i不可能小于 8。

于 2012-11-08T13:35:44.473 回答
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 );   
于 2012-11-08T13:36:46.810 回答
2

循环在 时退出i == 8,因为循环条件说:只要 保持迭代i < 8。或者换一种说法:当i >= 8.

所以i++循环内的最后一个将分配8i,退出循环。这解释了您获得的结果,并且它们符合预期。也许您错误地认为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 );
于 2012-11-08T13:37:40.927 回答
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
于 2012-11-08T13:39:54.587 回答
1

如果您知道操作顺序,这真的很简单

  • STEP_1 - 身体操作前的动作。
  • SETP_2 - 如果为真,则评估继续操作的逻辑表达式。
  • STEP_3 - 执行身体操作。
  • STEP_4 - 身体手术后的动作。

所以:

for(STEP_1; STEP_2; STEP_4) {
    STEP_3
}

通常在第 1 步中我们初始化我们的变量,在第 4 步中我们修改它以供下一次循环评估。

int i = 0;

for(; i< 8; i++) {

}

循环在 时中断i == 8,正如在循环之前声明的值保持不变。

于 2012-11-08T13:47:17.547 回答
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);
于 2012-11-08T13:38:00.210 回答