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