如何继续工作?

use*_*432 29 java for-loop continue break while-loop

我试图了解"继续"的工作原理.我理解了关键字的概念,但是当我运行不同的程序时,它的工作方式不同: - /让我向您展示一些示例:

如果我运行这个程序:

int j = 0;
int i = 0;
LABEL1: for (; i < 3; i++) {
  if (true)
    continue;
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的价值将是3.让我们添加一个外循环:

int j = 0;
int i = 0;
LABEL2: for (; j < 3; j++) {
  LABEL1: for (; i < 3; i++) {
    if (true)
      continue LABEL2;
  }
}
Run Code Online (Sandbox Code Playgroud)

我的价值将是... 0 !! 我不明白为什么如果继续使用带有转到外部循环的标签,我不会增加.有人能解释一下为什么吗?你有一些棘手的东西吗?还是做了一段时间?

我非常感谢您提供的任何帮助.

ars*_*jii 28

基本for陈述结构如下:

BasicForStatement:
for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement

现在,来自JLS§14.14.1.3.突然完成for声明:

如果由于没有标签而突然完成Statement的执行,则按顺序执行以下两个步骤:continue

  1. 首先,如果存在ForUpdate部分,从左到右依次评估表达式 ; 它们的值(如果有的话)被丢弃.如果ForUpdate部分不存在,则不执行任何操作.

  2. 其次,for执行另一个迭代步骤.

如果由于带有标签而突然完成Statement的执行,则可以选择:continueL

  • 如果for语句具有标签L,则按顺序执行以下两个步骤:

    1. 首先,如果存在ForUpdate部分,则从左到右依次评估表达式; 它们的值(如果有的话)被丢弃.如果ForUpdate不存在,则不执行任何操作.

    2. 其次,for执行另一个迭代步骤.

  • 如果for语句没有标签L,则for语句会因为标签的继续而突然完成L.

(强调我的)

ForUpdate,在您的情况下,是i++.基于以上内容:

  • 你的第一个片段属于第一种情况,因此i会增加.

  • 你的第二个片段属于第二种情况,所以i不会增加,因为 for语句突然完成.

请注意,如果您continue LABEL1在第二个代码段中i有所增加,则会在第一个代码段中增加(根据JLS).

作为未来的提示,关于语言规则/语义的明确答案,您应该始终参考语言规范.对于Java,那就是JLS.


小智 14

这很正常.exectuion流程如下:

  1. J = 0
  2. I = 0
  3. 输入LABEL 2循环,
  4. 输入LABEL 1循环,
  5. 继续LABEL 2
  6. J ++
  7. 输入LABEL 1循环,
  8. 继续LABEL 2
  9. J ++
  10. 输入LABEL 1循环,
  11. 继续到LABEL 2 ...直到j == 3

  • 这不值得赞成.它没有解释继续做什么.显示exexution的流程不是一个答案 (6认同)
  • 它将有助于显示第一个片段中的不同之处. (2认同)

Eri*_*ler 7

i会在内循环结束时增加.但continue LABEL2跳出内环,到外环的末端,所以i没有增加; 而只是j增加,直到不再满足外循环条件.

当我们用while循环重写代码时,可能会更清楚:

int j=0;
int i = 0;
while (j<3) {
    while(i<3) {
       if (true)
           goto END_OF_LOOP2;

       END_OF_LOOP1: i++;
    }
    END_OF_LOOP2: j++;
}
Run Code Online (Sandbox Code Playgroud)


Rem*_*der 6

继续简单地做它的名字所暗示的,它会立即继续循环的下一次执行而不执行循环中的其余代码.

所以,如果你有这样的循环:

int j=0;
int i = 0;
    LABEL1 : for(;i < 3; i++){
        if (true) {
            continue;
        }
        someOtherMethod();
    }
Run Code Online (Sandbox Code Playgroud)

someOtherMethod部分永远不会执行,因为您将始终点击继续.

你的计数器永远不会增加的原因与标签有关,你可以用标签标记一个循环(在你的情况下LABEL1,LABEL2并使用该标签继续你的内循环的一个外循环.

因此,对于您的代码,循环LABEL1永远不会有机会增加其计数器,因此i仍然是0因为您的continue语句会立即继续到外循环的下一次迭代.