Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 省道标签控制-不了解流程_Dart - Fatal编程技术网

Dart 省道标签控制-不了解流程

Dart 省道标签控制-不了解流程,dart,Dart,考虑以下dart代码: void main(List<String> args) { firstLoop: for (var i = 0; i < 2; i++) { print('${i}::I am in the first loop'); secondLoop: for (var j = 0; j < 2; j++) { print('${j}::I am in the second loop.'); th

考虑以下
dart
代码:

void main(List<String> args) {
  firstLoop:
  for (var i = 0; i < 2; i++) {
    print('${i}::I am in the first loop');

    secondLoop:
    for (var j = 0; j < 2; j++) {
      print('${j}::I am in the second loop.');

      thirdLoop:
      for (var k = 0; k < 2; k++) {
        print('${k}::I am in the third loop');

        fourthLoop:
        for (var l = 0; l < 2; l++) {
          print('${l}::I am in the fourth loop');
          break secondLoop;
        }
      }
    }
  }
}
对于以下代码:

void main(List<String> args) {
  firstLoop:
  for (var i = 0; i < 2; i++) {
    print('${i}::I am in the first loop');

    secondLoop:
    for (var j = 0; j < 2; j++) {
      print('${j}::I am in the second loop.');

      thirdLoop:
      for (var k = 0; k < 2; k++) {
        print('${k}::I am in the third loop***');

        fourthLoop:
        for (var l = 0; l < 2; l++) {
          print('${l}::I am in the fourth loop');
          break thirdLoop;
        }
      }
    }
  }
}
我不能真正理解这个流程。
这种行为就像:

当我跳转到某个标签时,会执行该标签上方的语句或块吗


看来我的理解并不清楚。请让我对此有更多的了解/了解。

当您中断一个带标签的语句时,无论它是否为循环,它的行为都好像该语句刚刚正常完成一样(不抛出、不返回,也不返回任何其他控制流)

标记语句的形式为
label:statement
。语句不必是循环,但通常是循环

所以,如果你写:

打印(“之前的外部”);
标签:{
打印(“之前的内部”);
断开标签;//断开到带标签语句*的*结尾处。
打印(“后内页”);
}//这里是标记语句的结尾。
打印(“外部后”);
它将打印:

outside before
inside before
outside after
只要可以引用,就可以打断任何语句。 没有标签的
中断
自动引用最近的封闭循环或
开关
语句。如果您想中断以中断任何其他语句,您需要先给它一个带有标签的名称,这样您就可以执行
breaklabel
指定要中断的语句

(您也可以在
开关的
盒上有标签。您不能打断这些标签,因为它们不是语句,您必须打断
开关
。)

在您的示例中,您正在中断一个循环,该循环也是外部循环的最后一个语句。当你打破内循环时,你到达了外循环主体的末端,然后它进入下一个迭代(如果它有一个)。这就是为什么它看起来像是在倒退,它击中了循环的末端并向后循环,就像循环通常做的那样

因此,
break
不会跳转到标签,而是退出标签语句

如果要继续使用该标签,可以使用
continue label取而代之。继续循环意味着返回到循环头,并(可能)进行循环的另一次迭代。它的工作原理正是从循环体中突破。结束主体,然后正常循环行为接管

例如:

for(变量i=0;i<5;i++){
打印(“之前:$i”);
如果(i.isEven)继续;
打印(“之后:$i”);
}
这张照片是:

before: 0
before: 1
after: 1
before: 2
before: 3
after: 3
before: 4
它适用于各种循环,甚至
do
-
:

var i=0;
做{
打印(“之前:$i”);
如果(i.isEven)继续;
打印(“之后:$i”);
}而(++i<5);

打印相同的内容。

我认为您的第一个示例存在一些问题。代码不可能生成该输出。@julemand101,对不起,我复制了两次相同的输出。我不确定您认为哪一部分是荒谬的,因为不清楚您预期的行为。如果您希望
break thirdLoop
跳转到
thirdLoop
标签,那么您将
break thirdLoop
continue thirdLoop
混为一谈
break thirdLoop
会跳出标有
thirdLoop
的循环。因此,例如
break secondLoop
意味着跳出第二个循环,而不是跳转到第二个循环标签?是的,
break secondLoop
会跳出第二个循环,从而跳到第一个循环的下一个迭代。