【问题标题】:Unknown code in Java [duplicate]Java中的未知代码[重复]
【发布时间】:2015-12-23 21:24:17
【问题描述】:

我正在浏览 SO 以查看 Java 中的问题,并且遇到了一些有趣的代码。 考虑以下代码:

class A {
public static void main(String[] args) {
    int n = 13;
    found: {
        for (int x : new int[]{2,3,4,5,6,7,8,9,10,11,12})
            if (n % x == 0) {
                System.out.println("" + n + " equals " + x + "*" + (n/x));
                break found;
            }
        System.out.println("" + n + " is a prime number");
    }
}

}

请记住,我不是 Java 的资深人士,也不是专业的程序员(所以请指出我明显遗漏的任何内容)。现在,我很好奇这条线是什么意思:

found: {

我的第一个观察结果是它设置了一个变量,但经过进一步检查,我意识到我显然不是。那么它在做什么呢? Java 中有这个名字吗?

【问题讨论】:

  • Found 是循环的别名。 break found 表示停止循环。

标签: java class for-loop methods iterator


【解决方案1】:

这是一个有标签的声明。 JLS-14.7. Labeled Statements 说(部分)

语句可能有标签前缀。

 LabeledStatement:
     Identifier : Statement

 LabeledStatementNoShortIf:
     Identifier : StatementNoShortIf

Identifier 被声明为立即包含的 Statement 的标签。

与 C 和 C++ 不同,Java 编程语言没有goto 语句;标识符语句标签与出现在标签语句中的任何位置的break (§14.15) 或continue (§14.16) 语句一起使用。

它通常与嵌套循环一起使用,从内部循环到break

out: for (int i = 0; i < 100; i++) {
    for (int j = 0; j < 100; j++) {
        if (j == 1) {
            break out;
        }
    }
}

【讨论】:

  • 我很困惑,你能把标签叫做方法吗?
  • j1 时,哪个loop 应该停止。或者continue,如果我们尝试一下的话。您可以使用标签来控制continuebreak 的哪个循环。通常当你可以终止当前上下文并继续外部上下文时。
  • Frisch 你能不能只使用嵌套的for loop 内部包含break 语句?与嵌套循环相比,使用标签有什么优势?
  • @Matthewacon 这只会破坏内部循环。
  • 上面的例子终止了外循环。打破内部循环如何做到这一点?再次阅读 JLS 报价。
【解决方案2】:

它是一个标签,就像过去几天甜蜜甜蜜的 GOTO 声明一样。我从来没有见过这在实践中使用过。

【讨论】:

  • 我有。控制嵌套循环终止。
  • @ElliottFrisch 我最感兴趣的是使用它的上下文,愿意分享:D
  • Here 就是一个例子(post hoc ergo propter hoc)。
【解决方案3】:

它就像一个 GOTO,这里有一些例子:

   for (int i = 0; i < 10; i++) {
        System.out.println(i);
        if(i == 5)
            break;
    }

打印:

0
1
2
3
4
5

然后

    badGoto:
    for (int i = 0; i < 10; i++) {
        System.out.println(i);
        for (int j = 0; j < 2; j++) {
            System.out.println(j+"j");
            if(i == 1)
                break badGoto;
        }
    }

打印:

0
0j
1j
1
0j 

【讨论】:

    【解决方案4】:

    found 部分称为标签。你看有没有声明

    break found;
    

    稍后在代码中?那是你使用标签的地方。 found 正在标记 for 循环。下一次,当你想说 for 循环时,说found。因此,break 语句意味着:跳出 for 循环。

    你说,“为什么我不能写break;?”。有时我们使用嵌套循环。在这些情况下,标签很重要。如果你想从内循环中打破外循环,你不能只写一个简单的break;。因为它只会破坏内部循环,而不会破坏外部循环。当外循环的迭代完成后,内循环将再次执行。您可以在外循环中添加标签,可以将其命名为outer,并在内循环中写入break outer;

    但我从未编写过任何使用它的代码。我从不使用标签终止我的循环。所以可能有很多程序员不知道这个功能!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多