我对执行下一个代码感到困惑:
label:
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) continue;
if (i == 99) {
continue label;
}
System.out.println("i = " + i);
}
我希望这个循环是无限的。但是没有。当值为 99 时 - 程序退出。我尝试与continue
和break
操作员一起玩,但仍然没有预期结果。
我只是试图理解为什么这个循环不是无限的,我将如何做到这一点?
输出:
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 语句时,请记住:
初始化
- 表达式初始化循环;它已执行 一次,随着循环的开始。
- 当终止表达式的计算结果为 如果为假,则循环终止。
- 增量表达式在之后调用 循环中的每次迭代;这是完全可以接受的 表达式来递增或递减值。