西安企业网站制作公司,怎么在手机上搭建网站,网站专题设计欣赏,公司网站二维码生成器goto 关键字很早就在程序设计语言中出现。事实上#xff0c;goto 是汇编语言的程序控制结构的始祖#xff1a;“若条件 A#xff0c;则跳到这里#xff1b;否则跳到那里”。若阅读由几乎所有编译器生成的汇编代码#xff0c;就会发现程序控制里包含了许多跳转。然而#…goto 关键字很早就在程序设计语言中出现。事实上goto 是汇编语言的程序控制结构的始祖“若条件 A则跳到这里否则跳到那里”。若阅读由几乎所有编译器生成的汇编代码就会发现程序控制里包含了许多跳转。然而goto 是在源码的级别跳转的所以招致了不好的声誉。若程序总是从一个地方跳到另一个地方还有什么办法能识别代码的流程呢随着 Edsger Dijkstra 著名的“Goto 有害”论的问世goto 便从此失宠。事实上真正的问题并不在于使用 goto 而在于 goto 的滥用。而且在一些少见的情况下goto 是组织控制流程的最佳手段。尽管 goto 仍是 Java 的一个保留字但并未在语言中得到正式使用Java 没有 goto 。然而在 break 和continue 这两个关键字的身上我们仍然能看出一些 goto 的影子。它并不属于一次跳转而是中断循环语句的一种方法。之所以把它们纳入 goto 问题中一起讨论是由于它们使用了相同的机制标签。“标签”是后面跟一个冒号的标识符就象下面这样label1:对 Java 来说唯一用到标签的地方是在循环语句之前。进一步说它实际需要紧靠在循环语句的前方——在标签和循环之间置入任何语句都是不明智的。而在循环之前设置标签的唯一理由是我们希望在其中嵌套另一个循环或者一个开关。这是由于 break 和 continue 关键字通常只中断当前循环但若随同标签使用它们就会中断到存在标签的地方。如下所示label1:外部循环{内部循环{//...break; //1//...continue; //2//...continue label1; //3//...break label1; //4}}在条件 1 中break 中断内部循环并在外部循环结束。在条件 2 中continue 移回内部循环的起始处。但在条件 3 中continue label1 却同时中断内部循环以及外部循环并移至 label1 处。随后它实际是继续循环但却从外部循环开始。在条件 4 中break label1 也会中断所有循环并回到 label1 处但并不重新进入循环。也就是说它实际是完全中止了两个循环。下面是 for 循环的一个例子// : LabeledFor.java// Java’s labeled for looppublic class LabeledFor {public static void main(String[] args) {int i 0;outer: // Cant have statements herefor (; true;) { // infinite loopinner: // Cant have statements herefor (; i 10; i) {prt(i i);if (i 2) {prt(continue);continue;}if (i 3) {prt(break);i; // Otherwise i never// gets incremented.break;}if (i 7) {prt(continue outer);i; // Otherwise i never// gets incremented.continue outer;}if (i 8) {prt(break outer);break outer;}for (int k 0; k 5; k) {if (k 3) {prt(continue inner);continue inner;}}}}// Cant break or continue// to labels here}static void prt(String s) {System.out.println(s);}}这里用到了在其他例子中已经定义的 prt()方法。注意 break 会中断 for 循环而且在抵达 for 循环的末尾之前递增表达式不会执行。由于 break 跳过了递增表达式所以递增会在 i3 的情况下直接执行。在 i7 的情况下continue outer 语句也会到达循环顶部而且也会跳过递增所以它也是直接递增的。下面是输出结果i 0continue inneri 1continue inneri 2continuei 3breaki 4continue inneri 5continue inneri 6continue inneri 7continue outeri 8break outer如果没有 break outer 语句就没有办法在一个内部循环里找到出外部循环的路径。这是由于 break 本身只能中断最内层的循环(对于 continue 同样如此)。当然若想在中断循环的同时退出方法简单地用一个 return 即可。下面这个例子向大家展示了带标签的 break 以及 continue 语句在 while 循环中的用法//: LabeledWhile.java//Javas labeled while looppublic classLabeledWhile {public static voidmain(String[] args) {int i 0;outer:while (true) {prt(Outer while loop);while (true) {i;prt(i i);if (i 1) {prt(continue);continue;}if (i 3) {prt(continue outer);continueouter;}if (i 5) {prt(break);break;}if (i 7) {prt(break outer);breakouter;}}}}static voidprt(String s) {System.out.println(s);}}///:~同样的规则亦适用于 while(1) 简单的一个 continue 会退回最内层循环的开头(顶部)并继续执行。(2) 带有标签的 continue 会到达标签的位置并重新进入紧接在那个标签后面的循环。(3) break 会中断当前循环并移离当前标签的末尾。(4) 带标签的 break 会中断当前循环并移离由那个标签指示的循环的末尾。这个方法的输出结果是一目了然的Outer while loopi 1continuei 2i 3continue outerOuter while loopi 4i 5breakOuter while loopi 6i 7break outer大家要记住的重点是在 Java 里唯一需要用到标签的地方就是拥有嵌套循环而且想中断或继续多个嵌套级别的时候。在 Dijkstra 的“Goto 有害”论中他最反对的就是标签而非 goto 。随着标签在一个程序里数量的增多他发现产生错误的机会也越来越多。标签和 goto 使我们难于对程序作静态分析。这是由于它们在程序的执行流程中引入了许多“怪圈”。但幸运的是Java 标签不会造成这方面的问题因为它们的活动场所已被限死不可通过特别的方式到处传递程序的控制权。由此也引出了一个有趣的问题通过限制语句的能力反而能使一项语言特性更加有用。---------------------作者淡紫色呼吸来源CSDN原文https://blog.csdn.net/jinghuayuanli/article/details/16844765