问题标签 [goto]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
2830 浏览

php - PHP中的GOTO命令?

我听说 PHP 计划引入“goto”命令的传言。它应该做什么?

我尝试搜索了一下,但没有找到任何非常具有描述性的内容。我知道这不会是一个类似“ GOTO 10”的命令......

0 投票
26 回答
53270 浏览

language-agnostic - 在支持循环和函数的语言中是否有“goto”的合法用例?

长期以来,我一直认为goto如果可能的话,永远不要使用它。

然而,前几天在仔细阅读 libavcodec(用 C 语言编写)时,我惊讶地发现它有多种用途。

goto使用支持循环和函数的语言是否有利?如果是这样,为什么?请提供一个明确证明使用goto.

0 投票
49 回答
88250 浏览

language-agnostic - GOTO 仍然被认为是有害的?

每个人都知道 Dijkstra给编辑的信:go to 被认为有害的语句(也在这里.html 成绩单和这里.pdf),并且从那时起一直在大力推动尽可能避开 goto 语句。虽然可以使用 goto 生成无法维护的庞大代码,但它仍然存在于现代编程语言中。即使是 Scheme 中高级的延续控制结构,也可以说是复杂的 goto。

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

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


Dijkstra 本人对这个头衔感到遗憾,他不对此负责。在EWD1308(也在这里.pdf)的结尾,他写道:

最后写一个短篇记录。1968 年,ACM 通讯发表了我的一篇题为“被认为有害的 goto 语句”的文本,在后来的几年里,它被最常引用,但遗憾的是,经常被那些只看过它的作者引用。标题,通过成为模板成为我成名的基石:对于几乎任何 X,我们都会看到标题为“X 被认为有害”的各种文章,包括标题为“Dijkstra 被认为有害”的文章。但是发生了什么?我已经提交了一篇题为“反对 goto 语句的案例”的论文”,为了加快出版速度,主编改成了“致主编的信”,并在此过程中给了它一个自己发明的新标题!主编是尼克劳斯·沃斯。

关于这个主题的一篇经过深思熟虑的经典论文,与 Dijkstra 的论文相匹配,是Donald E. Knuth的Structured Programming with go to Statements 。阅读都有助于重建上下文和对主题的非教条式理解。在这篇论文中,Dijkstra 对这个案例的看法被报道并且更加强烈:

Donald E. Knuth:我相信,通过提出这样的观点,我实际上并没有强烈反对 Dijkstra 的想法,因为他最近写道:“请不要陷入相信我对 [the go to statement]。我有一种不舒服的感觉,其他人正在把它变成一种宗教,好像编程的概念问题可以通过一个技巧,通过一种简单的编码纪律形式来解决!

0 投票
17 回答
3181 浏览

language-agnostic - 继续 被认为是有害的?

开发人员是否应该避免在 C# 中使用continue或其他语言中的等价物来强制循环的下一次迭代?支持或反对的论点是否会与有关Goto的论点重叠?

0 投票
16 回答
169550 浏览

c++ - C 或 C++ 中好的 goto 示例

在这个线程中,我们看一下goto在 C 或 C++ 中良好使用的示例。它的灵感来自人们投票赞成的答案,因为他们认为我在开玩笑。

摘要(标签从原来的改变,使意图更加清晰):

为什么它比替代品更好:

  • 这是具体的。 goto是导致无条件分支的语言结构。替代方案取决于使用支持条件分支的结构,具有退化的始终为真条件。
  • 标签记录了意图,没有额外的注释。
  • 读者不必扫描 early breaks 的介入代码(尽管没有原则的黑客仍然可以 continue使用 early进行模拟goto)。

规则:

  • 假装gotophobes没有赢。据了解,以上内容不能在实际代码中使用,因为它违反了既定的习惯用法。
  • 假设我们都听说过“Goto 被认为有害”并且知道 goto 可用于编写意大利面条式代码。
  • 如果您不同意某个示例,请仅根据技术优点批评它(“因为人们不喜欢 goto”不是技术原因)。

让我们看看我们是否可以像成年人一样谈论这个问题。

编辑

这个问题现在似乎结束了。它产生了一些高质量的答案。感谢大家,尤其是那些认真对待我的小循环示例的人。大多数怀疑论者担心缺乏块范围。正如@quinmars 在评论中指出的那样,您始终可以在循环体周围放置大括号。我顺便指出for(;;)while(true)也不要免费给你大括号(省略它们会导致令人烦恼的错误)。无论如何,我不会再在这件小事上浪费你的脑力——我可以忍受无害和惯用的for(;;)while(true)(如果我想保住工作也一样)。

考虑到其他回应,我看到许多人认为goto你总是必须以另一种方式重写。当然你可以goto通过引入一个循环、一个额外的标志、一堆嵌套if的 s 或其他什么来避免 a,但是为什么不考虑是否goto可能是这项工作的最佳工具呢?换句话说,人们准备忍受多少丑陋以避免将内置语言功能用于其预期目的?我的看法是,即使添加一面旗帜也付出了高昂的代价。我喜欢我的变量来代表问题或解决方案域中的事物。'仅仅为了避免goto'并没有削减它。

我会接受第一个答案,它给出了用于分支到清理块的 C 模式。IMO,这为goto所有已发布的答案提供了最有力的案例,当然,如果您通过扭曲来衡量它,那么仇恨者必须通过这些扭曲来避免它。

0 投票
1 回答
2888 浏览

c++ - goto 和析构函数兼容吗?

此代码导致未定义的行为:

构造函数没有被调用。

但是这段代码呢?x 的析构函数会被调用吗?我想会的,但我想确定一下。:)

0 投票
35 回答
80750 浏览

c++ - GOTO 还是不 GOTO?

目前我正在研究一个大量使用 goto 语句的项目。goto 语句的主要目的是在例程中有一个清理部分,而不是多个返回语句。如下所示:

这使得它更容易,因为我们可以在代码的一个部分(即 Exit 标签之后)跟踪我们的清理代码。

但是,我已经阅读了很多地方,使用 goto 语句是不好的做法。

目前我正在阅读Code Complete这本书,它说我们需要使用接近其声明的变量。如果我们使用 goto,那么我们需要在第一次使用 goto 之前声明/初始化所有变量,否则编译器将给出错误,即 goto 语句跳过了 xx 变量的初始化。

哪种方式是正确的?


来自斯科特的评论:

看起来使用 goto 从一个部分跳转到另一个部分是不好的,因为它使代码难以阅读和理解。

但是,如果我们只使用 goto 前进并转到一个标签,那么它应该没问题(?)。

0 投票
21 回答
591114 浏览

python - Python中有标签/转到吗?

Python 中是否有一个goto或任何等效项能够跳转到特定的代码行?

0 投票
8 回答
2588 浏览

goto - 为什么 goto 实践不佳?

这个问题是 Goto Still Considered Harmful的副本。如果您想进一步讨论这个问题,请使用原始问题。

为什么 GOTO 编程习惯不好?在某些情况下使用它是有意义的。

0 投票
16 回答
14136 浏览

vb.net - 什么时候可以在 VB.Net 中使用 GoTo 语句?

我有需要在数据库中创建一堆记录并在出现任何问题时回滚所有记录的过程。我想做的是:

这是对 GoTo 语句的正确使用,还是只是非常糟糕的设计?有没有更优雅的解决方案?希望这个样本能够理解这一点