文章目录

  • 前言
  • 一、goto是什么?
  • 二、goto与Java的关系
    • 1.关系
    • 2.Java中的标签
    • 2.break和continue的进阶用法
  • 总结

前言

goto语句是在源码级上的跳转,这使得其招致了不好的声誉。Dijkstra发表了著名论文《Goto considered harmful》(goto有害)若一个程序总是从一个地方跳到另一个地方,那么还有什么办法能识别程序的流程控制呢?


一、goto是什么?

goto起源于汇编语言的程序控制:“若条件A允许,则跳进这里;否则跳到那里”。如果阅读由编译器最终生成的汇编代码,就会发现程序控制里面包含了许多跳转。(Java编译器生成他自己的“汇编代码”,但是这个代码是运行在Java虚拟机上的,而不是在CPU硬件上的。)

二、goto与Java的关系

1.关系

尽管在Java中有goto这个保留字,但在语言中却用不到它。Java没有goto,但是Java也能完成一些类似于跳转的操作,这与break和continue用法有关。总所周知,他们并不是一个跳转,而是中断迭代语句的一种方法。能够与goto相提并论的关键在于,这二者与goto有相同的机制——标签

2.Java中的标签

标签:后面带有冒号的标识符   例:  label:

在Java中,标签起作用的唯一地方恰好是在迭代语言之前。这句话的意思是:在标签和迭代之间置入任何语句都是不好的。而在迭代之前设置标签的唯一理由就是:我们希望在其中一个嵌套另一个迭代或者开关。

3.break和continue的进阶用法(即结合标签)

1.代码如下(示例):

label1:outer-iteration{inner-iteration{//...continue;    (1)使执行点移回到内部迭代的起始处//...break;         (2)中断内部迭代,回到外部迭代//...continue label1;  (3)同时中断内部迭代和外部迭代,直接转到label1处//...break label1;    (4)同3}}

从上我们能注意到(3)(4)均能跳到标签处,值得注意的是label1后面不能添加任何语句

2.下面这个例子我们将更加清楚continue和break带标签的区别

public class Draft_07 {public static void main(String[] args) {int i = 0;outer:while(true){System.out.println("outer while loop");while(true){i++;System.out.println("i = "+i);if (i == 1){System.out.println("continue");continue;}if (i == 3){System.out.println("continue outer");continue outer;}if (i == 5){System.out.println("break");break;}if (i == 7){System.out.println("break outer");break outer;}}}}
}

我们会发现二者具体的区别

a.带标签的continue会到达标签的位置,并重新进入紧接在那个标签后的循环。

b.带标签的break会中断并跳出标签所指的循环。

要记住的重点是,在Java中唯一要使用标签的理由就是因为有嵌套循环的存在,而且是想从多层嵌套中break或continue


总结

《Goto considered harmful》(goto有害)论文中最反对的其实是标签而不是goto,因为实践证明程序随着标签的增加而产生的错误增加,且不利于程序的分析。但在Java由于标签的应用场合受到限制并不会引起这种问题,正如Java编程思想一书中所言的一个现象,通过限制语言的能力,反而能使一项语言特性变得更加有用。

goto在Java中的替代(break和continue的进阶用法)相关推荐

  1. Java跳转语句break与continue

    Java跳转语句break与continue 概述: ​ 人为的对循环执行进行控制时使用的语句 分类: break:打断 在选择语句中结束整个选择语句的 在循环语句中结束整个循环,后续循环不执行 co ...

  2. 解析java当中switch语句的作用和break、continue关键字的用法

    解析java当中switch语句的作用和break.continue关键字的用法 A. switch语句 1.含义 是分支结构,使程序按照条件的判断结果去执行相应的程序代码. 2.语法 switch( ...

  3. Python自学20201202 while、for 、if、else、break、continue等相关用法

    Python自学20201202 while.for .if.else.break.continue等相关用法.常用常玩,来来回回一直循环, 学这个要点,把自己当机器,跟着循环. print(&quo ...

  4. break与continue的的用法以及区别

    /* break与continue的的用法以及区别 1. 当它们用在循环语句的循环体时,break用于立即退出本层循环,而continue仅仅结束本次循环(本次循环体内不执行 continue语句后的 ...

  5. c语言continue语句作用,C语言break和continue的语句用法

    1.知识了解 在c语言中,为了使用循环控制更灵活,c语言允许在特定条件成立时使用break语句和continue语句控制循环的执行过程 ♞break:用于循环语句和switch语句中,它跳出所在的那一 ...

  6. Java循环中的break 和 continue

    CSDN话题挑战赛第1期 活动详情地址:https://marketing.csdn.net/p/bb5081d88a77db8d6ef45bb7b6ef3d7f 参赛话题:Java学习记录 话题描述 ...

  7. java break的用法_Java基础break、continue语句的用法

    break适用范围:只能用于switch或者是循环语句中.当然可以用于增强for循环. break作用: 1. break用于switch语句的作用是结束一个switch语句. 2. break用于循 ...

  8. Delphi中exit、break、continue等跳出操作的区别

    Delphi中表示跳出的有break,continue,abort,exit,halt,runerror等 1.break 强制退出最近的一层循环(注意:只能放在循环里:而且是只能跳出最近的一层循环) ...

  9. Java中static、this、super、final用法

    一.static 请先看下面这段程序: public class Hello{ public static void main(String[] args){ //(1) System.out.pri ...

最新文章

  1. 异常检测算法:Isolation Forest
  2. 数据管理、数据治理、数据管控的概念区别和范围是什么?
  3. HDU 1425 sort(堆排序)
  4. python xlsxwriter 画图_Python XlsxWriter模块Chart类用法实例分析
  5. oracle用户登录的认证方式
  6. ajax点评wnv冠军,对话wNv高层探知焦点 剑指世界冠军铸就王者路
  7. Exchange 2010 创建设备室邮箱
  8. C# 实现软件自动更新升级程序
  9. Weblogic加Apache的负载均衡以及群集配置
  10. 抓人眼球!插画风精美的网站首页设计欣赏
  11. SQL SERVER将多行数据合并成一行(转载)
  12. CDH QuickStart VM基本使用
  13. java file.listFiles()按文件名称、日期、大小排序
  14. LINUX下载编译sqlite-jdbc的jar包
  15. innobackupex 恢复到mysql目录_innobackupex备份mysql恢复后迁移到新的mysql实例
  16. project2016资源管理
  17. 谷歌浏览器快捷键_一览表【Mac】
  18. Emacs - Verilog mode 自动实例化
  19. 【Unity2D好项目分享】提高游戏人物打击感
  20. freebase api的使用

热门文章

  1. Redis服务器重启后数据丢失的处理办法
  2. 微信公众号开发不能下载文件处理方式
  3. Android使用jxl快速导出Excel表格
  4. 做哪些网站基本优化可以提高网站权重?
  5. [软件使用]macos上更新系统后无法使用git
  6. python 二维列表相加_python怎么对列表求和
  7. 文件打印(print-js)
  8. weui和jquery weui关系
  9. Virtuoso ADEXL函数定义SPEC
  10. 华为云专家招募-天津华为云EI技术私享会