C或C+中的Gotos示例在这个线程中,我们将查看使用goto在C或C+中。它的灵感来自回答人们投票赞成是因为他们认为我在开玩笑。摘要(标签从原版改为使意图更加清晰):infinite_loop:
// code goes heregoto infinite_loop;为什么它比其他选择更好:很具体。goto是导致无条件分支的语言结构。可选方案取决于使用支持条件分支的结构,其条件总是退化的。标签记录了意图,没有额外的注释。读者不必提前扫描中间的代码breakS(尽管无原则的黑客仍然有可能模拟continue早早goto).规则:假装守望者没有赢。据了解,以上这些不能在实际代码中使用,因为它与已建立的成语背道而驰。假设我们都听说过‘Goto认为有害’,并知道Goto可以用来编写意大利面代码。如果你不同意一个例子,那么仅仅根据技术上的优点来批评它(因为人们不喜欢Goto)并不是一个技术原因。看看我们能不能像大人一样谈论这件事。编辑这个问题似乎已经解决了。它产生了一些高质量的答案。感谢大家,尤其是那些认真对待我的小循环榜样的人。大多数怀疑论者都担心缺乏封闭的范围。正如@Quenmars在评论中指出的那样,您始终可以在循环体周围放置大括号。我顺便注意到for(;;)和while(true)也不要给你免费的支撑(而忽略它们可能会导致令人烦恼的错误)。不管怎么说,我不会再把你的脑力浪费在这件小事上了-我可以忍受那些无害的、习以为常的人。for(;;)和while(true)(如果我想保住我的工作,那也很好)。考虑到其他的反应,我看到很多人认为goto你总是要用另一种方式重写。当然,你可以避免goto通过引入一个循环,一个额外的标志,一个嵌套的堆栈ifS,什么的,但为什么不考虑一下goto也许是这份工作最好的工具?换句话说,人们为了避免使用内置的语言功能来达到预期的目的,准备忍受多少丑陋?我的看法是,即使是添加国旗也要付出高昂的代价。我喜欢我的变量来表示问题或解决方案领域中的事物。为了避免goto“不会割伤的。我将接受第一个答案,它给出了分支到清理块的C模式。国际海事组织,这是最有力的理由goto在所有张贴的答案,当然,如果你衡量它的扭曲,一个仇人必须经过,以避免它。
3 回答
慕仙森
TA贡献1827条经验 获得超7个赞
void foo(){ if (!doA()) goto exit; if (!doB()) goto cleanupA; if (!doC()) goto cleanupB; /* everything has succeeded */ return;cleanupB: undoB();cleanupA: undoA();exit: return;}
忽然笑
TA贡献1806条经验 获得超5个赞
void foo(){ if (!doA()) goto exit; if (!doB()) goto cleanupA; if (!doC()) goto cleanupB; /* everything has succeeded */ return;cleanupB: undoB();cleanupA: undoA();exit: return;}
波斯汪
TA贡献1811条经验 获得超4个赞
void foo(){ if (!doA()) goto exit; if (!doB()) goto cleanupA; if (!doC()) goto cleanupB; /* everything has succeeded */ return;cleanupB: undoB();cleanupA: undoA();exit: return;}
- 3 回答
- 0 关注
- 437 浏览
添加回答
举报
0/150
提交
取消