在这个线程中,我们看一下goto
在 C 或 C++ 中良好使用的示例。它的灵感来自人们投票赞成的答案,因为他们认为我在开玩笑。
摘要(标签从原来的改变,使意图更加清晰):
infinite_loop:
// code goes here
goto infinite_loop;
为什么它比替代品更好:
- 这是具体的。
goto
是导致无条件分支的语言结构。替代方案取决于使用支持条件分支的结构,具有退化的始终为真条件。 - 标签记录了意图,没有额外的注释。
- 读者不必扫描 early
break
s 的介入代码(尽管没有原则的黑客仍然可以continue
使用 early进行模拟goto
)。
规则:
- 假装gotophobes没有赢。据了解,以上内容不能在实际代码中使用,因为它违反了既定的习惯用法。
- 假设我们都听说过“Goto 被认为有害”并且知道 goto 可用于编写意大利面条式代码。
- 如果您不同意某个示例,请仅根据技术优点批评它(“因为人们不喜欢 goto”不是技术原因)。
让我们看看我们是否可以像成年人一样谈论这个问题。
编辑
这个问题现在似乎结束了。它产生了一些高质量的答案。感谢大家,尤其是那些认真对待我的小循环示例的人。大多数怀疑论者担心缺乏块范围。正如@quinmars 在评论中指出的那样,您始终可以在循环体周围放置大括号。我顺便指出for(;;)
,while(true)
也不要免费给你大括号(省略它们会导致令人烦恼的错误)。无论如何,我不会再在这件小事上浪费你的脑力——我可以忍受无害和惯用的for(;;)
和while(true)
(如果我想保住工作也一样)。
考虑到其他回应,我看到许多人认为goto
你总是必须以另一种方式重写。当然你可以goto
通过引入一个循环、一个额外的标志、一堆嵌套if
的 s 或其他什么来避免 a,但是为什么不考虑是否goto
可能是这项工作的最佳工具呢?换句话说,人们准备忍受多少丑陋以避免将内置语言功能用于其预期目的?我的看法是,即使添加一面旗帜也付出了高昂的代价。我喜欢我的变量来代表问题或解决方案域中的事物。'仅仅为了避免goto
'并没有削减它。
我会接受第一个答案,它给出了用于分支到清理块的 C 模式。IMO,这为goto
所有已发布的答案提供了最有力的案例,当然,如果您通过扭曲来衡量它,那么仇恨者必须通过这些扭曲来避免它。