如何继续工作?

2022-09-01 13:50:42

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

如果我运行这个程序:

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

i 的值将为 3。目前为止,一切都好。让我们添加一个外部循环:

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

i 的值将是 ...0 !!我不明白为什么如果继续与进入外部循环的标签一起使用,i不会递增。有人能解释一下为什么吗?你有一些棘手的事情,像这样休息?或者用一个 do {} while ?

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


答案 1

基本语句结构如下:for

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

现在,从JLS §14.14.1.3开始。突然完成声明

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

  1. 首先,如果存在 ForUpdate 部分,则按从左到右的顺序计算表达式;它们的值(如果有)将被丢弃。如果 ForUpdate 部分不存在,则不执行任何操作。

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

如果语句的执行由于带有标签 L继续而突然完成,则有一个选择:

  • 如果语句具有 label ,则按顺序执行以下两个步骤:forL

    1. 首先,如果存在 ForUpdate 部分,则按从左到右的顺序计算表达式;它们的值(如果有)将被丢弃。如果 ForUpdate 不存在,则不执行任何操作。

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

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

(强调我的)

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

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

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

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

作为未来的提示,有关语言规则/语义的明确答案,您应该始终查阅语言规范。对于Java来说,这就是JLS


答案 2

这真的很正常。执行流程是这样的:

  1. j=0
  2. i=0
  3. 输入标签 2 循环,
  4. 输入了标签 1 个循环,
  5. 继续标签 2
  6. j++
  7. 输入了标签 1 个循环,
  8. 继续标签 2
  9. j++
  10. 输入了标签 1 个循环,
  11. 继续标签 2 ...直到 j==3