继续/中断时不必要的标签



我对执行下一个代码感到困惑:

        label:
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) continue;
            if (i == 99) {
                continue label;
            }
            System.out.println("i = " + i);
        }

我希望这个循环是无限的。但是没有。当值为 99 时 - 程序退出。我尝试与continuebreak操作员一起玩,但仍然没有预期结果。

我只是试图理解为什么这个循环不是无限的,我将如何做到这一点?

输出:

i = 1
i = 3
......
i = 93
i = 95
i = 97
Process finished with exit code 0

>continue继续标记的循环,这不涉及将i重置为其初始值;因此,您所做的任何事情都不会阻止i增加,直到它达到100并且循环终止。是的,您是正确的,标签是不必要的。

要使其无限,只需在循环中重置i,无需标签或continue

for (int i = 0; i < 100; i++) {
    if (i == 99) {
        i = 0;
    }
    System.out.println("i = " + i);
}

或者也许是这个,它再次输出 99 然后 0 并继续前进:

for (int i = 0; i < 100; i++) {
    System.out.println("i = " + i);
    if (i == 99) {
        i = -1;
    }
}

或者,如果出于某种原因,您真的非常想用continue来执行此操作,则需要第二个外部循环:http://ideone.com/ofgpK3

label:
while (true) {
    for (int i = 0; i < 100; i++) {
        System.out.println("i = " + i);
        if (i == 99) {
            continue label;
        }
    }
}

标签与你似乎混淆的goto指令完全不同。将程序流continue到标记的循环指令时,只能通过执行其下一个循环来continue其执行。当你在 i = 99 继续时,你只执行具有下一个迭代值的for循环,i = 100呈现循环的条件i < 100 false,以便循环终止。

您尝试实现的目标需要一个外部循环,例如:

label: while (true) {
  for (int i = 0; ; i++) {
    if (i % 2 == 0) continue;
      if (i == 99) {
        continue label;
       }
       System.out.println("i = " + i);
    }
  }
}

请注意,我删除了 for 循环中的条件,该条件现在是多余的,因为显式跳回到外部while循环隐式导致内部循环终止。此跳转重新启动内部循环,因此导致计数器重置为 i = 0 。一般来说,这种显式程序流很难阅读并且容易混淆,因此人们应该尽可能避免它,原因与想要避免标签是非常轻量级版本的 goto 语句的原因相同。

每次(i % 2 == 0)(i == 99)为真时,您都会继续执行 for 循环(而不是打印出数字(。但是当我达到 99 时,您的条件i < 100达到了,循环退出了。

为了更容易的无限循环,请使用

while(true) {
    //Your code
}

for(;;) {
    //Your code
}
i

初始化一次。 continue不会将i重置为 0,因此当您到达continue标签时,for循环中的条件将被评估为 false ,您将跳过它。

请参阅文档:

使用此版本的 for 语句时,请记住:

    初始化
  • 表达式初始化循环;它已执行 一次,随着循环的开始
  • 当终止表达式的计算结果为 如果为假,则循环终止。
  • 增量表达式在之后调用 循环中的每次迭代;这是完全可以接受的 表达式来递增或递减值。

最新更新