在continue/break上不必要的标签

3

我对执行下面的代码感到困惑:

        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

1
@BhargavRao 已更新。 - Sergey Shustikov
1
我猜你应该阅读http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html,特别是“continue语句”部分。 - Alexis C.
4个回答

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;
        }
    }
}

非常感谢您的详细解释!我会在6分钟后接受您的答案。Stackoverflow现在不允许我这样做。 - Sergey Shustikov

1
一个标签与你混淆的东西,它与goto指令完全不同。当你将程序流程继续到标记循环指令时,你只是通过执行其下一个循环来继续执行它的执行。当你在i = 99处继续执行时,你只会执行下一个迭代值i = 100的for循环,这使得循环条件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);
    }
  }
}

注意,我已经删除了循环内部的条件,因为显式跳回外部 while 循环会隐含地导致内部循环终止,这使得条件多余。这个跳转重新启动内部循环,从而导致计数器重置为 i = 0。一般来说,这样明确的程序流程很难阅读,容易混淆,因此应尽可能避免使用它,原因与要避免使用 goto 语句相同,其中标签是非常轻量级的版本。

0

你在使用for循环时,每次当(i % 2 == 0)(i == 99)成立时,就会继续执行循环(但不打印该数字)。但当i达到99时,满足条件i < 100,循环退出。

如果需要一个更简单的无限循环,请使用

while(true) {
    //Your code
}

或者

for(;;) {
    //Your code
}

0

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

请参见文档

当使用for语句的这个版本时,请记住:

  • 初始化表达式初始化循环;在循环开始时执行它一次
  • 当终止表达式评估为false时,循环终止。
  • 每次迭代循环后都会调用增量表达式;该表达式递增或递减值是完全可以接受的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接