Java 如何继续工作?

Java 如何继续工作?,java,for-loop,while-loop,break,continue,Java,For Loop,While Loop,Break,Continue,我试图理解“继续”是如何工作的。我理解关键字的概念,但当我运行不同的程序时,它的工作方式不同:-/ 让我举几个例子: 如果我运行此程序: int j = 0; int i = 0; LABEL1: for (; i < 3; i++) { if (true) continue; } intj=0; int i=0; 标签1:for(;i

我试图理解“继续”是如何工作的。我理解关键字的概念,但当我运行不同的程序时,它的工作方式不同:-/ 让我举几个例子:

如果我运行此程序:

int j = 0;
int i = 0;
LABEL1: for (; i < 3; i++) {
  if (true)
    continue;
}
intj=0;
int i=0;
标签1:for(;i<3;i++){
如果(真)
继续;
}
我的值是3。到现在为止,一直都还不错。 让我们添加一个外部循环:

int j = 0;
int i = 0;
LABEL2: for (; j < 3; j++) {
  LABEL1: for (; i < 3; i++) {
    if (true)
      continue LABEL2;
  }
}
intj=0;
int i=0;
LABEL2:for(;j<3;j++){
标签1:for(;i<3;i++){
如果(真)
继续LABEL2;
}
}
我的价值将是。。。0 !! 我不明白,如果continue与指向外部循环的标签一起使用,为什么我不会递增。有人能解释一下原因吗? 你在休息时有没有像这样的棘手的事情?还是用一段时间

我真的很感激你能提供的任何帮助

continue LABEL2; 
导致只有外部循环增加。如果你有

LABEL2 : for(;j <3;j++){
    LABEL1 : for(;i < 3; i++){
             if (true)
                 continue LABEL1;
             }
     }

LABEL2:for(;j
i
将在内环的末端增加。但是
continue LABEL2
跳出内环,跳到外环的末端,因此
i
不会增加;相反,只有
j
增加,直到不再满足外环条件

当我们使用
重写代码,而使用
循环时,可能会变得更清晰:

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++;
}
intj=0;
int i=0;

语句结构的基本
(j

BasicForStatement: for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement 基本陈述: for([ForInit];[Expression];[ForUpdate])语句 现在,从:

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

  • 首先,如果存在ForUpdate部分,将按从左到右的顺序计算表达式;如果有,则丢弃它们的值。如果ForUpdate部分不存在,则不采取任何操作

  • 其次,执行另一个
  • 迭代步骤

    如果由于标签为
    L
    continue
    导致语句执行突然完成,则有一个选择:

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

  • 首先,如果ForUpdate部分存在,表达式将按从左到右的顺序求值;如果有值,则丢弃它们。如果ForUpdate不存在,则不采取任何操作

  • 其次,执行另一个
  • 迭代步骤

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

  • (强调矿山)

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

    • 您的第一个代码段属于第一种情况,因此
      i
      是递增的

    • 您的第二个代码段属于第二种情况,因此
      i
      不会递增,因为
      for
      语句突然完成

    请注意,如果在第二个代码段中有
    continue LABEL1
    i
    会像在第一个代码段中一样递增(根据JLS)


    作为未来的提示,要获得关于语言规则/语义的明确答案,您应该始终参考语言规范。对于Java,这是最基本的。

    这是非常正常的。执行流程如下所示:

    int j=0;
    int i = 0;
        LABEL1 : for(;i < 3; i++){
            if (true) {
                continue;
            }
            someOtherMethod();
        }
    
  • j=0
  • i=0
  • 已输入标签2循环
  • 已输入标签1循环
  • 继续标记2
  • j++
  • 已输入标签1循环
  • 继续标记2
  • j++
  • 已输入标签1循环
  • 继续标记2 …直到j==3

  • 如果在调试模式下运行,您将看到发生了什么。简而言之,每当您进入内部循环以增加
    i
    ,您将继续
    LABEL2
    ,而不是增加
    i
    ,并进入内部循环的下一次迭代

    因此,您将在外循环中停留3次,并且永远不会在内循环中点击
    i++

    如果更简单,请将内部for循环想象为while循环:

    int i = 0, j = 0;
    LABEL2: for (; j < 3; j++) {
      LABEL1: while (i < 3) {
        if (true) {
          continue LABEL2;
        }
    
        i++;
      }
    }
    
    inti=0,j=0;
    LABEL2:for(;j<3;j++){
    标签1:while(i<3){
    如果(真){
    继续LABEL2;
    }
    i++;
    }
    }
    
    Continue只是按照其名称执行,它立即继续执行循环的下一次执行,而不执行循环中的其余代码

    while (getNext(line)) {
      if (line.isEmpty() || line.isComment())
        continue;
      // More code here
    }
    
    如果你有这样一个循环:

    int j=0;
    int i = 0;
        LABEL1 : for(;i < 3; i++){
            if (true) {
                continue;
            }
            someOtherMethod();
        }
    
    intj=0;
    int i=0;
    标签1:for(;i<3;i++){
    如果(真){
    继续;
    }
    someOtherMethod();
    }
    
    someOtherMethod部分永远不会执行,因为您将始终点击continue

    计数器从不递增的原因与标签有关,您可以使用标签(在您的情况下是
    LABEL1
    LABEL2
    标记一个循环,并使用该标签继续内部循环的一个外部循环

    因此,对于您的代码,
    LABEL1
    的循环从来没有机会增加其计数器,因此
    i
    保持
    0
    ,因为您的continue语句立即继续到外循环的下一次迭代。

    如果这是代码, 例如:

        int main (){
          // Local variable declaration:
    
        int a = 10;
    
       // do loop execution
      do
      {
         if( a == 15)
         {
            // skip the iteration.
            a = a + 1;
            continue;
          }
          cout << "value of a: " << a << endl;
               a = a + 1;
             }while( a < 20 );
             return 0;
         }
    
    需要注意的一点: “a:15的值”不在输出中。 在编程语言中continue跳过循环中的某一行,如果使用了“break”,则break仅在“14”之后离开该行(在本例中)。
    为便于理解,请参见以下流程图:

    i
    在下次检查条件时递增

    如果
    继续
    中断
    循环,则不会再次检查条件,也不会增加
    
    
    LABEL2 : for(;j <3;j++){
            LABEL1 : for(;i < 3; i++){
                     if (true)
                         continue LABEL2;
                     }
             }
    
    LABEL1 : for(;i < 3; i++){
                   if (true)
                       break;
                 }
    
    while (getNext(line)) {
      if (line.isEmpty() || line.isComment())
        continue;
      // More code here
    }
    
    aLoopName: for (;;) {
      // ...
      while (someCondition)
      // ...
        if (otherCondition)
          continue aLoopName;
    
    for (count = 0; foo.moreData(); count++)   continue;