我对下一个代码的执行感到困惑:
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
答案 0 :(得分:3)
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;
}
}
}
答案 1 :(得分:1)
标签与 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语句相同。的版本。
答案 2 :(得分:0)
每次(i % 2 == 0)
或(i == 99)
为真时,您都会继续使用for循环(而不是打印出数字)。但是当我达到99时,你的条件i < 100
已经到达并且循环退出。
要获得更容易的无限循环,请使用
while(true) {
//Your code
}
或
for(;;) {
//Your code
}
答案 3 :(得分:0)
i
只初始化一次。 continue
未将i
重置为0,因此当您到达continue
标签时,for
循环中的条件将评估为false
,而且你会跳过它。
请参阅docs:
使用此版本的for语句时,请记住:
- 初始化表达式初始化循环; 它被执行了 一次,当循环开始。
- 终止表达式求值为 假,循环终止。
- 之后调用增量表达式 每次迭代循环;这是完全可以接受的 表达式增加或减少值。