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
会跳出第二个循环,从而跳到第一个循环的下一个迭代。