为了账号安全,请及时绑定邮箱和手机立即绑定

C或C+中的Gotos示例

/ 猿问

C或C+中的Gotos示例

C++ C
狐的传说 2019-07-22 10:39:38

C或C+中的Gotos示例

在这个线程中,我们将查看使用goto在C或C+中。它的灵感来自回答人们投票赞成是因为他们认为我在开玩笑。

摘要(标签从原版改为使意图更加清晰):

infinite_loop:

    // code goes heregoto infinite_loop;

为什么它比其他选择更好:

  • 很具体。

    goto

    是导致无条件分支的语言结构。可选方案取决于使用支持条件分支的结构,其条件总是退化的。
  • 标签记录了意图,没有额外的注释。
  • 读者不必提前扫描中间的代码

    break

    S(尽管无原则的黑客仍然有可能模拟

    continue

    早早

    goto).

规则:

  • 假装守望者没有赢。据了解,以上这些不能在实际代码中使用,因为它与已建立的成语背道而驰。
  • 假设我们都听说过‘Goto认为有害’,并知道Goto可以用来编写意大利面代码。
  • 如果你不同意一个例子,那么仅仅根据技术上的优点来批评它(因为人们不喜欢Goto)并不是一个技术原因。

看看我们能不能像大人一样谈论这件事。

编辑

这个问题似乎已经解决了。它产生了一些高质量的答案。感谢大家,尤其是那些认真对待我的小循环榜样的人。大多数怀疑论者都担心缺乏封闭的范围。正如@Quenmars在评论中指出的那样,您始终可以在循环体周围放置大括号。我顺便注意到for(;;)while(true)也不要给你免费的支撑(而忽略它们可能会导致令人烦恼的错误)。不管怎么说,我不会再把你的脑力浪费在这件小事上了-我可以忍受那些无害的、习以为常的人。for(;;)while(true)(如果我想保住我的工作,那也很好)。

考虑到其他的反应,我看到很多人认为goto你总是要用另一种方式重写。当然,你可以避免goto通过引入一个循环,一个额外的标志,一个嵌套的堆栈ifS,什么的,但为什么不考虑一下goto也许是这份工作最好的工具?换句话说,人们为了避免使用内置的语言功能来达到预期的目的,准备忍受多少丑陋?我的看法是,即使是添加国旗也要付出高昂的代价。我喜欢我的变量来表示问题或解决方案领域中的事物。为了避免goto“不会割伤的。

我将接受第一个答案,它给出了分支到清理块的C模式。国际海事组织,这是最有力的理由goto在所有张贴的答案,当然,如果你衡量它的扭曲,一个仇人必须经过,以避免它。


查看完整描述

3 回答

?
慕莱坞森

这是我听说过的人们使用的伎俩。不过我从没在野外见过。而且它只适用于C,因为C+有Raii来更具体地做这件事。

void foo(){
    if (!doA())
        goto exit;
    if (!doB())
        goto cleanupA;
    if (!doC())
        goto cleanupB;

    /* everything has succeeded */
    return;cleanupB:
    undoB();cleanupA:
    undoA();exit:
    return;}


查看完整回答
反对 回复 2019-07-22
?
翻过高山走不出你

C中对Goto的典型需求如下

for ...
  for ...
    if(breakout_condition) 
      goto final;final:

在没有Goto的情况下,没有简单的方法可以摆脱嵌套的循环。



查看完整回答
反对 回复 2019-07-22
?
喵喔喔

下面是我的一个不傻的例子(来自StevensAPITUE),用于可能被信号中断的Unix系统调用。

restart:
    if (system_call() == -1) {
        if (errno == EINTR) goto restart;

        // handle real errors
    }

另一种方法是退化循环。这个版本读起来像英文,“如果系统调用被信号中断,请重新启动它”。


查看完整回答
反对 回复 2019-07-22

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信