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

时间:2016-01-07 19:50:18

标签: 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);

我认为输出结果为:"i is 5 isPrime is false",因为当i=5number % i == 0true时,变量isPrime变为{ {1}}并且循环不会继续。

所以当循环返回

false

它不会增加for (i = 2; i < number && isPrime; i++) ,因为条件不再有效(i)。发生了什么事?

3 个答案:

答案 0 :(得分:7)

我认为你理解循环的概念是错误的。具有结构的for循环:

for(init; cond; inc) {
    body
}

的工作原理如下:

  1. 首先执行init;
  2. 接下来评估条件,如果条件为true,则转到3,否则为结束循环。
  3. 执行body
  4. 执行inc(无论条件是否成立);
  5. 转到2。
  6. 根据指定,增量(对于您的示例i++ 将始终在执行body 后调用无论条件是否成立因此,您可以将上述for循环重写为:

    for(init; cond;) {
        body;
        inc
    }
    

    (所以在for标题处有一个空的增量)。在这里,编译器无法消除bodyinc之间的歧义。 for循环的语法结构使得程序员不会忘记执行增量,这是while循环中经常出现的典型错误。

答案 1 :(得分:3)

如果您要循环停在i < number,则必须先i++

循环系统并不知道您将在isPrime上停下来并且&#34;知道&#34;不打扰增加。

你应该做的是放弃旗帜,因为它会更简单。

int number = 25;

for (int i = 2; i < number; i++) {
  if (number % i == 0) {
     System.out.println("i is " + i + " " + number + " is not prime");
     break;
  }
}

答案 2 :(得分:1)

我从来没有见过像这样编写for循环的人。请尝试使用break关键字代替:

int number = 25;
boolean isPrime = true;

for (int i = 2; i < number; i++) {
    if (number % i == 0) {
      isPrime = false;
      break;
  }
}

System.out.println("i is " + i + " isPrime is " + isPrime);