goto
的良好使用示例。这受到答案的启发,因为人们认为我在开玩笑而被投票提升。摘要(标签已更改以使意图更清晰):
infinite_loop:
// code goes here
goto infinite_loop;
为什么它比其他替代方案更好:
- 它很具体。
goto
是语言结构,会导致无条件分支。而其他替代方案则依赖于使用支持有条件分支的结构,并带有一个退化了的总是为真的条件。 - 标签记录了意图,不需要额外的注释。
- 读者不必扫描中间代码以寻找早期的
break
(尽管不道德的黑客仍然可以通过早期的goto
模拟continue
)。
规则:
- 假设gotophobes没有获胜。我们知道上述内容不能在实际代码中使用,因为它违反了已建立的习惯用法。
- 假设我们都听说过'Goto considered harmful',并知道goto可用于编写Dijkstra式的spaghetti code。
- 如果您不同意某个示例,请仅基于技术优势进行批评(“因为人们不喜欢goto”不是技术原因)。
让我们看看能否像成年人一样谈论这个问题。
编辑
这个问题现在看起来已经完成了。它产生了一些高质量的答案。感谢每个人,特别是那些认真考虑了我的小循环示例的人。大多数怀疑论者都担心缺乏块作用域。正如@quinmars在评论中指出的那样,您总是可以在循环体周围放置大括号。我顺便提一下,for(;;)
和while(true)
也没有免费提供大括号(省略它们可能会引起恼人的错误)。无论如何,我不会再浪费你的脑力在这个琐碎的问题上 - 我可以接受无害且惯用的for(;;)
和while(true)
(如果我想保住自己的工作的话)。
考虑到其他回答,我发现许多人认为goto
始终需要以另一种方式重写。当然,您可以通过引入循环、一个额外的标志、嵌套的if语句堆栈或任何其他方法来避免goto
,但是为什么不考虑是否goto
是执行该任务的最佳工具呢?换句话说,人们愿意忍受多少丑陋的代码才能避免使用用于其预期目的的内置语言特性?我的看法是甚至添加一个标志也是太高的代价。我喜欢我的变量表示问题或解决方案领域中的事物。‘仅仅为了避免goto
’无法达到这个目的。
我会接受第一个给出分支到清理块的C语言模式的答案。在我看来,这是所有发布的答案中对于使用goto
最强有力的论据,特别是如果你通过避免它所需要做的扭曲操作来衡量的话。
for (;;)
) 没有令人惊讶的入口点。 - jalf