关于循环终止时计数器变量的混淆

ak1*_*652 0 java for-loop

对于这段代码:

int number = 25;
int i;

boolean isPrime = true;
for (i = 2; i < number && isPrime; i++) {
  if (number % i == 0) {
    isPrime = false;
  }
}

System.out.println("i is " + i + " isPrime is " + isPrime);
Run Code Online (Sandbox Code Playgroud)

我的印象是,输出会是下:"i is 5 isPrime is false",从何时起i=5,number % i == 0true,这样的变量isPrime成为false循环将无法继续.

所以当循环返回时

for (i = 2; i < number && isPrime; i++)
Run Code Online (Sandbox Code Playgroud)

它不会增加i,因为条件不再有效(i < number && isPrime).这是怎么回事?

Wil*_*sem 7

我认为你以错误的方式理解循环的概念.一个for结构循环:

for(init; cond; inc) {
    body
}
Run Code Online (Sandbox Code Playgroud)

工作原理如下:

  1. 首先init执行;
  2. 接下来评估条件,如果条件是true,则转到3,否则,结束循环.
  3. body执行
  4. inc被执行(条件无论是否成立);
  5. 转到2.

正如指定的那样,增量(对于您的示例,i++始终在执行之后调用body,无论条件是否成立.因此,您可以将上述for循环重写为:

for(init; cond;) {
    body;
    inc
}
Run Code Online (Sandbox Code Playgroud)

(所以在for标题处有一个空的增量).在这里,编译器无法消除body和之间的歧义inc.for循环的语法以这样的方式构造,使得程序员不会忘记执行增量,这是通常在while循环中发生的典型错误.