继续/休息时不必要的标签

时间:2014-12-14 11:39:55

标签: java loops

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

        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

4 个答案:

答案 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语句时,请记住:

     
      
  • 初始化表达式初始化循环; 它被执行了   一次,当循环开始
  •   
  • 终止表达式求值为   假,循环终止。
  •   
  • 之后调用增量表达式   每次迭代循环;这是完全可以接受的   表达式增加或减少值。
  •