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 仍然被视为有害吗? [关闭] 的相关文章

  • 如何在 Objective-C 的 switch 语句中使用 goto?

    在我的代码中 我需要能够在同一个 switch 语句中跳转 转到 不同的情况 有没有办法做到这一点 我的代码是这样的 有很多代码我都省略了 switch viewNumber case 500 break case 501 break ca
  • 如何正确区分树(即嵌套的字符串列表)?

    我正在使用由嵌套字符串列表组成的数据类型的在线编辑器 请注意 如果每次更改单个值时我都要传输整个结构 那么流量可能会变得难以忍受 所以 为了减少流量 我想到了应用 diff 工具 问题是 如何找到并报告两棵树的差异 例如 ah bh ha
  • 使用 goto 跳过变量声明?

    我在读C 编程 现代方法由 K N King 学习 C 编程语言 并指出goto语句不得跳过可变长度数组声明 但现在的问题是 为什么goto跳转允许跳过 固定长度数组声明和普通声明吗 更准确地说 根据 C99 标准 此类示例的行为是什么 当
  • 将数字缩放为 <= 255?

    我的单元格的数值可以是 0 到 0 之间的任何值Integer MAX VALUE 我想对这些单元格进行相应的颜色编码 如果该值 0 则 r 0 如果该值是Integer MAX VALUE 则 r 255 但是中间的值呢 我想我需要一个函
  • 语法分析和语义分析有什么区别?

    据我了解 Parser由词法分析 句法分析和语义分析三个阶段组成 Lexical 它将我的输入分割成标记 例子 123 100 0 gt 123 100 0 语法 它将研究标记并检查它们是否彼此有意义 我遇到的问题是理解最后阶段的 语义解析
  • 从应用程序中删除死代码的最佳方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我经常觉得 在多次迭代我的代码之后 我留下了一些函数 类或其他代码行 这些代码在以前的版本中有意义 但对于新版本来说并不是很有用 我知道探查器可
  • 是否有可能比 O(n log n) 更好地计算数字列表的中位数?

    我知道可以在 O n 中计算数字列表的平均值 但是中位数呢 有没有比排序 O n log n 和查找中间元素 或者如果列表中有偶数个项目则两个中间元素的平均值 更好的算法 是的 您可以在 O n 时间内 确定性地 完成此操作 http ww
  • Google 文件系统中的块大小问题

    谷歌文件系统论文 http labs google com papers gfs html 块大小是关键设计之一 参数 我们选择了64MB 这比典型文件大得多 系统块大小 每个块 副本存储为普通 Linux 文件放在 chunkserver
  • 什么是样板代码、热点代码和热点?

    我知道这些术语是在性能实现 优化的背景下使用的 最近一直在研究这个问题 并尝试过搜索 但没有得到任何例子 清楚地阐述 描述这些概念以及在现实世界开发场景中实现这些问题 概念 有人可以彻底解释这些术语 示例场景以及可能使用这些概念和术语的地方
  • 数据库、表和列命名约定? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 每当我设计数据库时 我总是想知道是否有命名数据库中项目的最佳方法 我经常问自己以下问题 表名应该是复数吗 列名应该是单数吗 我应该为表或列添加前
  • 哪种数据聚类算法适合检测时间序列事件中未知数量的聚类?

    这是我的场景 考虑在不同地点和时间发生的一组事件 例如 考虑有人在高空记录暴风雨期间城市中的雷击 就我的目的而言 闪电是瞬时的 只能击中某些位置 例如高层建筑 还可以想象每次雷击都有一个唯一的 ID 以便以后可以参考该雷击 这个城市大约有1
  • 如何通用地减少子集平均值的计算?

    Edit 由于似乎没有人阅读此链接的原始问题 因此让我在这里介绍一下它的概要 正如其他人所问的 最初的问题是 给定大量值 总和将超过数据类型的值Double那么如何计算这些值的平均值呢 有几个答案说要按集合计算 比如取50个和50个数字 计
  • 需要帮助解决 Project Euler 问题 200 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试制定一个算法来解决 We
  • 未使用的功能会产生什么后果

    我想知道在代码中使用未使用的函数会产生什么 如果有什么后果 如果您查找并删除所有未使用的函数和变量 性能是否会有明显的改进 或者删除未使用的函数和变量只是一个好习惯 未使用的功能不会损害性能 他们让维护代码的人的工作变得更加困难 现代 ID
  • 在数字集合中查找最接近的匹配[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 使用面向对象的分析和设计对电梯进行建模[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 当涉及到面向对象的设计和分析时 有一组问题似乎在面试和课堂上很常见 这是其中之一 不幸的是 我在大学的 OOP 教授从未真正给出过答案 所以我一
  • 如何在 Perforce 树中查找未跟踪的文件? (svn状态的模拟)

    有人有脚本或别名来查找 Perforce 树中未跟踪 实际上 未添加 的文件吗 编辑 我更新了对此已接受的答案 因为看起来 P4V 在 2009 年 1 月的版本中添加了对此的支持 EDIT 请用p4 status现在 不再需要跳圈了 参见
  • 获取Windows下新线程/删除线程的通知

    创建 DLL 时 您可以在 DllMain 函数 DLL THREAD ATTACH DLL THREAD DETACH 中获取有关新线程 退出线程的通知 有没有办法在 非托管 可执行文件中从 Windows 获取这些或等效通知 是的 在您
  • 检查按钮是否可用?如果没有,请等待 5 秒钟,然后再次检查?

    基本上我想看看此刻是否可以单击按钮 如果没有我想再试一次 所以我需要某种 goto 函数来返回到代码的前一行 尽管我怀疑我写得非常糟糕 但它本来可以做得更容易 try driver findElement By xpath button i
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去

随机推荐

  • 为什么当工作交错时 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