【问题标题】:Different control flow statement can have the same title不同的控制流语句可以有相同的标题
【发布时间】:2017-01-13 02:09:17
【问题描述】:

有 2 个不同的嵌套循环,每个循环都有一个 break 语句来在特定条件下中断外部循环。

我想知道如果我将 2 个外部循环标记为相同的标题,这是否会引发 break 语句的混淆?

然后我尝试了下面的代码sn-ps

//#1
outterLoop: for x in 1...3 {
    innerLoop: for y in 1...3 {
        if x == 3 {
            break outterLoop //break the "outterLoop"
        } else {
            print("x: \(x), y: \(y)")
        }
    }
}

//#2
outterLoop: for a in 1...3 {
    innerLoop: for b in 1...3 {
        if b == 3 {
            break outterLoop //break the "outterLoop"
        } else {
            print("a: \(a), b: \(b)")
        }
    }
}

事实证明代码运行良好,没有出现重新声明问题。我认为这可能与范围主题有关。 first break只能看到#1代码块中的outterLoopsecond em> break 只能在它所在的范围内看到 outterLoop,也就是 #2 代码块。结果,不可见的作用域限制了内部break可以“看到”的变量

问题:我理解正确吗?如果没有,请纠正我。即使我没有错,我相信我使用了非正式和不精确的描述。如果您能给我一个更正式和准确的描述,那就太好了。

非常感谢

【问题讨论】:

    标签: swift scope flow-control


    【解决方案1】:

    “标签语句的范围是语句标签之后的整个语句。可以嵌套带标签的语句,但每个语句标签的名称必须是唯一的。”

    摘自:Apple Inc. “Swift 编程语言 (Swift 2.2)。”电子书。 https://itun.es/de/jEUH0.l

    第一个outterLoop:标签的作用域是第一个for循环, 第二个outterLoop: 标签的范围是第二个 for循环。

    因此第一个循环内的break outterLoop只能引用 到第一个outterLoop: 标签,同样适用于 第二个循环。

    这与 C 中的 goto 语句及其目标标签不同 只需要在同一个函数中,因此没有两个 同名标签可以在同一个函数中定义。

    【讨论】:

      【解决方案2】:

      你是对的,标签的范围仅限于它所标注的语句。来自 Swift 2.2 语言参考:

      带标签的语句的范围是紧随其后的整个语句 声明标签。您可以嵌套带标签的语句,但每个语句的名称 语句标签必须是唯一的。

      这很直观,因为您只能标记循环、if 语句和 switch 语句,而标签的唯一用途是跳出该语句,或继续它的下一次迭代.因此,标签在它所标注的语句之外可见是没有用的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多