GOTO 仍然被视为有害吗? [关闭]

2023-12-30

每个人都知道迪杰斯特拉 (Dijkstra)给编辑的信:转到被认为有害的声明 http://portal.acm.org/citation.cfm?doid=362947 (also here http://www.cs.utexas.edu/%7EEWD/transcriptions/EWD02xx/EWD215.html.html 成绩单和here http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD215.PDF.pdf),从那时起,人们就强烈要求尽可能避免使用 goto 语句。虽然可以使用 goto 生成不可维护的、庞大的代码,但它仍然存在现代编程语言 http://msdn.microsoft.com/en-us/library/13940fs2(VS.71).aspx。即使是高级的延续 http://en.wikipedia.org/wiki/Goto#ContinuationsScheme 中的控制结构可以描述为一个复杂的 goto。

什么情况下需要使用 goto?什么时候最好避免?

作为后续问题:C 提供了一对函数 setjmp() 和 longjmp(),它们不仅提供在当前堆栈帧内跳转的能力,而且还提供在任何调用帧内跳转的能力。这些是否应该被视为与 goto 一样危险?更危险吗?


迪杰斯特拉本人对这个头衔感到遗憾,他对此不负有责任。在......的最后EWD1308 http://www.cs.utexas.edu/%7EEWD/transcriptions/EWD13xx/EWD1308.html (also here http://www.cs.utexas.edu/%7EEWD/ewd13xx/EWD1308.PDF.pdf)他写道:

最后写一个小故事作为记录。 1968年,ACM通讯 在以下下发表了我的一篇文章 标题 ”考虑的 goto 语句 有害“,这将在以后的几年里 最常被引用的, 然而遗憾的是,作者常常 谁只见过它 的称号,成为了它的基石 我因成为模板而名声大噪:我们 会看到下面的各种文章 标题“X 被认为有害” 几乎所有 X,包括标题为 “迪杰斯特拉被认为是有害的”。但 发生了什么事情?我已经提交了一份 论文标题为“反对的案例 goto 语句“,其中,按顺序 为了加快其出版速度, 编辑已改为“致 编辑”,在这个过程中他 给它起了一个自己的新标题 发明!编辑是尼克劳斯 沃斯。

关于这个主题的一篇经过深思熟虑的经典论文,与 Dijkstra 的论文相匹配,是使用 go to 语句进行结构化编程 http://www.clifford.at/cfun/cliffdev/p261-knuth.pdf,唐纳德·E·高德纳 (Donald E. Knuth)。阅读两者都有助于重新建立背景和对主题的非教条理解。在这篇论文中,Dijkstra对此案的观点进行了报道,并且更加强烈:

唐纳德·E·高德纳 (Donald E. Knuth):我相信通过提出这样一个 我其实并不反对 与 Dijkstra 的想法截然相反,因为 他最近写了以下内容: “请不要落入陷阱 相信我很糟糕 关于[去 陈述]。我有不舒服的地方 感觉别人正在做一个 宗教脱离了它,仿佛 编程的概念问题 可以通过一个技巧来解决 一种简单形式的编码规则!"


我的一位同事说,使用 GOTO 的唯一原因是,如果您将自己编程到了一个角落,那么这是唯一的出路。换句话说,提前正确设计,以后就不需要使用 GOTO。

我认为这部漫画完美地说明了“我可以重组程序的流程,或者使用一个小‘GOTO’来代替。”当设计薄弱时,GOTO 是一种薄弱的出路。迅猛龙捕食弱者.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GOTO 仍然被视为有害吗? [关闭] 的相关文章

  • 如何检查一个盒子是否适合另一个盒子(允许任何旋转)

    假设我有两个盒子 每个盒子都是一个长方体 http en wikipedia org wiki Rectangular cuboid aka长方体 我需要编写一个函数来决定盒子是否具有尺寸 一 二 三 可以装入具有尺寸的盒子中 甲 乙 丙
  • Lockfree 标准集合和教程或文章

    有人知道用于无锁常用数据类型的实现 即源代码 的好资源吗 我正在考虑列表 队列等 锁定实现非常容易找到 但我找不到无锁算法的示例以及 CAS 的工作原理以及如何使用它来实现这些结构 查看 Julian M Bucknall 的博客 他 详细
  • PHP 中的 GOTO 命令?

    我听说 PHP 计划引入 goto 命令的传言 它应该做什么 我尝试搜索了一下 但没有找到任何具有描述性的内容 我明白这不会是 GOTO 10 类似命令 They are not adding a real GOTO but extendi
  • 生成所有多集大小为 n 的分区的算法

    我一直在试图找出一种方法来生成多重集的所有不同的大小为 n 的分区 但到目前为止却空手而归 首先让我展示一下我想要实现的目标 假设我们有一个输入向量uint32 t std vector
  • 两个程序对象运行时比较的方法

    我正在进行一种特定类型的代码测试 该测试相当麻烦并且可以自动化 但我不确定最佳实践 在描述问题之前 我想澄清一下 我正在寻找合适的术语和概念 以便我可以阅读有关如何实现它的更多信息 当然 欢迎就最佳实践提出建议 但我的目标很具体 这种方法叫
  • 过程式编程与 OOP 的开发成本?

    我有相当深厚的 OO 背景 OOD 和 OOP 的好处对我来说是第二天性 但最近我发现自己在一家与过程编程习惯相关的开发商店 实现语言具有一些 OOP 功能 但它们没有以最佳方式使用 更新 每个人似乎对这个话题都有自己的看法 我也是如此 但
  • 什么是拉姆达?

    有人可以很好地描述什么是 Lambda 吗 我们为它们设置了一个标签 它们涉及 C 问题的秘密 但我还没有找到一个很好的定义和解释来解释它们是什么 闭包 lambda 和匿名函数不一定是同一件事 匿名函数是任何没有 或者至少不需要 自己名称
  • 面向对象编程语言中的引用默认情况下是否应该不可为空? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 优雅降级 - 何时考虑

    在为使用 AJAX 的应用程序设计和构建 UI 时 您何时考虑优雅降级 对于禁用 JavaScript 或正在使用屏幕阅读器的用户 最后 网站的 AJAX 版本完全完成后 在每个发展阶段 I don t 还有别的事 这些日子 渐进增强 ht
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 如何为所有语言创建字母数字正则表达式?

    我今天遇到了这个问题 此正则表达式仅匹配英语 a zA Z0 9 如果我需要支持这个世界上的任何语言 我应该编写什么正则表达式 如果您使用字符类简写和 Unicode 识别正则表达式引擎 您就可以做到这一点 这 wclass 匹配 单词字符
  • 线性问题和非线性问题之间的区别?点积和核技巧的本质

    核技巧将非线性问题映射为线性问题 我的问题是 1 线性问题和非线性问题的主要区别是什么 这两类问题的差异背后的直觉是什么 核技巧如何帮助在非线性问题上使用线性分类器 2 为什么点积在这两种情况下如此重要 Thanks 当人们说到分类问题的线
  • 我使用仅大小写不同于其类型的变量名是不道德的吗?

    例如 采用这段代码 var person new Person 或者对于 Python 爱好者来说 person Person 我经常被告知这有多糟糕 但还没有看到这两行代码不道德的例子 对我来说 人就是一个人 试图给它起另一个名字是浪费时
  • 编程语言之间的关系

    我想知道以下问题 这是什么意思 有些语言是 另一个的子集 超集 http www c2 com cgi wiki ForeignFunctionInterface 能 是用数学来定义的吗 是吗 与子集 超集相关 初等集合论中的概念 几乎所有
  • 加密单个int的方法

    如何以廉价的方式对 32 位 int 进行双向加密 使每个数字都映射到该空间中的其他 int 并以难以预测的方式映射回来 当然 并且不需要在映射表中预先存储 42 9 亿个整数 您想要的是 32 位分组密码 不幸的是 大多数分组密码都是 6
  • Java 字节码中循环的检测 - 区分后沿类型

    背景 在提出问题之前 我想声明我已检查以下链接 识别java字节码中的循环 https stackoverflow com questions 6792305 identify loops in java byte code Java 字节
  • 为什么这个函数不是纯粹的?

    在维基百科文章中https en wikipedia org wiki Pure function Impure functions https en wikipedia org wiki Pure function Impure func
  • 当平方和为N时,如何找到四个变量的所有可能值?

    A 2 B 2 C 2 D 2 N给定一个整数N 打印出整数值的所有可能组合ABCD求解方程 我猜我们可以比暴力做得更好 天真的暴力会是这样的 n 3200724 lim sqrt n 1 for a 0 a lt lim a for b
  • 是否有加权水库采样的算法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 当数据流中的点具有相关权重时 是否有一种算法可以执行水库采样 Pavlos Efraimidis 和 Paul Spirakis 的算
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com

随机推荐

  • 为什么当工作交错时 TCP 写入延迟会更严重?

    我一直在分析 TCP 延迟 特别是write从用户空间到内核空间的小消息 以便获得对某个消息的延迟的一些直觉write 承认这可能是特定于上下文的 我注意到在我看来相似的测试之间存在很大的不一致 并且我非常想弄清楚差异从何而来 我知道微基准
  • 获取django应用程序的绝对路径

    我正在编写一个单元测试 需要访问我放在 django 应用程序目录下的 fixtures 目录中的图像文件 我想在测试中使用相对路径打开这个图像文件 这需要我获取 django 应用程序的绝对路径 有没有办法获取 django 应用程序的绝
  • 如何解析并输出具有动态值的JSON对象?

    我需要输出 JSON 对象 如下所示 dynamicvaluenumberone 3 dynamicvaluenumbertwo 7 在某些方面 看起来像 dynamicvaluenumberone 3 dynamicvaluenumber
  • 使用 Qt Creator 时的 CMake 配置问题

    我正在尝试使用 cmake 在 qt Creator 中设置构建环境 但无论我尝试什么 我都无法让它取得进展 它因问题而失败 配置问题 当展开一般消息部分中的详细信息时 它看起来像是无法编译测试 C 程序 我看不出我的 qt 创建者配置有什
  • Java:如何获取OS X Lion中的滚动方法?

    由于 OS X 支持 自然滚动 因此我的应用程序无法正常工作 自然滚动是为滚动窗格设计的 我真的很喜欢 但是 当我想放大 缩小时 它会出错 所以 我想做的是检查 OS X 的滚动方法 如果它是 自然的 我将采用与滚动值相反的值MouseWh
  • 如何在Numpy中实现ReLU函数

    我想制作一个使用 ReLU 函数的简单神经网络 有人可以告诉我如何使用 numpy 实现该函数吗 有几种方法 gt gt gt x np random random 3 2 0 5 gt gt gt x array 0 00590765 0
  • 如何在 EditText 中嵌入视图(带有按钮等)?

    我正在尝试找出如何嵌入东西 other与 Drawables 相比 在 EditText 小部件内 具体来说 我想到的例子来自 Google Buzz 小部件 截屏 http greydream org pics buzz png 没有内嵌
  • Google Apps 域上的 Google App Engine

    我无法将我的域名指向由 Google 应用引擎托管的网站 这是背景 注意区分 谷歌应用程序 域名托管 电子邮件等 和 谷歌应用程序引擎 网站框架 的概念 我有一个正在使用 Google Apps for Your Domain 的域 我们将
  • 在 XQuery 中搜索两个图节点之间的路径

    我正在尝试创建一种算法 用于搜索并返回 xQuery 中图形中两个节点之间的路径 但到目前为止我没有运气 因为它只返回一个节点及其相邻节点 首先 我应该明确该图是一个有向图 每个节点可以有零个 一个或多个原点 在 XML 中 节点仅具有到其
  • 如何使用 SSL 在 RHEL 上编译 python3?无法导入 SSL

    我正在尝试在 RHEL 上编译 python 因为我当前的 python 使用的是旧的 1 0 2k ssl 版本 test env brad reason tlscheck python3 version Python 3 9 3 tes
  • 带有 Linq Select 的 Expression> - CS1929 List 不包含“Select”的定义和最佳扩展方法

    我收到以下错误 但无法解决 CS1929 List
  • 将instanceof与类Object一起使用[重复]

    这个问题在这里已经有答案了 使这项工作正常进行的正确语法是什么 public boolean isTypeOf Class type return this instanceof type 我打算这样称呼它 foo isTypeOf MyC
  • 什么是以“t”开头的值以及如何在计数时忽略它们

    我正在尝试查询某些属性的频率Wikidata https query wikidata org 使用 SPARQL 例如 为了找出性别不同值的频率是多少 我有以下查询 SELECT rid COUNT rid AS count WHERE
  • 获取 127.0.1.1 而不是 192.168.1.* ip ubuntu python

    我是Python新手 我想获取系统的IP地址 我是在局域网中连接的 当我使用下面的代码获取IP时 它显示127 0 1 1而不是192 168 1 32 为什么不显示 LAN ip 那我怎样才能得到我的LAN ip呢 每个教程都只展示这种方
  • 使用 FileStream 创建文件会返回 InvalidOperationException

    它返回exception特别是在line 12 public void saveToXML URL newURL new URL newURL type type newURL name name newURL info info newU
  • Reactor 项目和 Java 内存模型

    我试图了解 Projectreactor 为应用程序代码提供的数据可见性方面的保证 例如我预计下面的代码会失败 但经过一百万次迭代后它不会失败 我正在更改线程 A 上典型 POJO 的状态 并从线程 B 读回它 Reactor 是否保证 P
  • 想要在本机反应中自动滚动平面列表

    我正在尝试自动滚动我的平面列表 但是当我运行代码时 我无法自动滚动 如果我想手动滚动 它会在每 5 秒后到达索引 0 这是我的平面列表及其 refs 函数的所有代码 在构造函数中 this flatList1 null 并在 compone
  • 在 webpack 构建中包含 git commit 哈希值和日期

    我正在使用react es6 webpack 我想在我的应用程序中的某处显示构建日期和 git 哈希值 最好的方法是什么 你可以使用 webpack 的定义插件 https webpack js org plugins define plu
  • WPF 文本块 TargetNullValue 不起作用?

    我有一个 wpf 文本块 如下所示
  • GOTO 仍然被视为有害吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 每个人都知道迪杰斯特拉 Dijkstra 给编辑的信 转到被认为有害的声明 http portal acm org citation cfm d