草庐IT

c++ - C 或 C++ 中好的 goto 示例

coder 2023-04-26 原文

关闭。这个问题需要更多focused .它目前不接受答案。




7年前关闭。










锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或互动。








在本主题中,我们将查看 goto 的良好使用示例。在 C 或 C++ 中。它的灵感来自 an answer哪些人投了赞成票,因为他们认为我在开玩笑。

总结(标签从原来的改变使意图更加清晰):

infinite_loop:

    // code goes here

goto infinite_loop;

为什么它比替代品更好:
  • 这是具体的。 goto
    语言结构导致
    无条件分支。替代品
    依赖于使用结构
    支持条件分支,
    带有退化的永远真实
    条件。
  • 标签记录意图
    没有额外的评论。
  • 读者无需扫描
    早期的干预代码 break
    (虽然仍然有可能
    无原则的黑客来模拟continue与早期 goto )。

  • 规则:
  • 假装goophobes没有
    赢。据了解,上述
    不能在实际代码中使用,因为
    它违背了既定的习语。
  • 假设我们都听说过
    “转到被认为有害”并知道
    goto 可以用来写
    意大利面代码。
  • 如果你不同意一个例子,
    批评它的技术值(value)
    独自一人('因为人们不喜欢
    goto' 不是技术原因)。

  • 让我们看看我们是否可以像大人一样谈论这个。

    编辑

    这个问题现在似乎结束了。它产生了一些高质量的答案。感谢大家,
    尤其是那些认真对待我的小循环示例的人。大多数怀疑论者担心
    由于缺少块作用域。正如@quinmars 在评论中指出的那样,您始终可以在
    循环体。我顺便注意到 for(;;)while(true)不要给你牙套
    免费(并且省略它们会导致令人烦恼的错误)。反正我不会再浪费了
    你的脑力在这件小事上 - 我可以忍受无害和惯用的for(;;)while(true) (如果我想保住我的工作也一样)。

    考虑到其他回复,我看到很多人都在查看 goto作为你总是
    必须以另一种方式重写。当然你可以避免 goto通过引入一个循环,
    一个额外的标志,一堆嵌套的 if s,或者其他什么,但为什么不考虑是否goto
    也许是这项工作的最佳工具?换句话说,为了避免将内置语言功能用于其预期目的,人们准备忍受多少丑陋?我的看法是
    甚至增加一面旗帜也付出了太高的代价。我喜欢我的变量来表示事物
    问题或解决方案域。 '只是为了避免 goto ' 并没有削减它。

    我将接受第一个答案,该答案给出了分支到清理块的 C 模式。 IMO,这是 goto 的最强案例在所有发布的答案中,当然
    如果你通过扭曲来衡量一个仇恨者必须经历的扭曲来避免它。

    最佳答案

    这是我听说人们使用的一种技巧。不过我从来没有在野外见过它。它只适用于 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;
    }
    

    关于c++ - C 或 C++ 中好的 goto 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/245742/

    有关c++ - C 或 C++ 中好的 goto 示例的更多相关文章

    1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

      我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

    2. ruby - 使用 `+=` 和 `send` 方法 - 2

      如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

    3. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

      //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

    4. ruby - 如何计算 Liquid 中的变量 +1 - 2

      我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

    5. ruby - 在好的 Ruby 代码中没有注释是否被认为是可以接受的? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭5年前。Improvethisquestion我审查了一些用Ruby编写的专业代码,没有发现任何评论。代码读起来相当清晰,但没有self记录。我应该期望专业编写的Ruby代码有注释吗?或者,是否有一些Ruby原则认为注释不是必需的?

    6. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

      我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

    7. arrays - Ruby 数组 += vs 推送 - 2

      我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

    8. += 的 Ruby 方法 - 2

      有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

    9. arrays - 如何在下面的示例中将两个值数组分组为 n 个值数组? - 2

      我已经有很多两个值数组,例如下面的例子ary=[[1,2],[2,3],[1,3],[4,5],[5,6],[4,7],[7,8],[4,8]]我想把它们分组到[1,2,3],[4,5],[5,6],[4,7,8]因为意思是1和2有关系,2和3有关系,1和3有关系,所以1,2,3都有关系我如何通过ruby​​库或任何算法来做到这一点? 最佳答案 这是基本Bron–Kerboschalgorithm的Ruby实现:classGraphdefinitialize(edges)@edges=edgesenddeffind_maximum_

    10. ruby - Google-api-ruby-client 翻译 API 示例 - 2

      很高兴看到google代码:google-api-ruby-client项目,因为这对我来说意味着Ruby人员可以使用GoogleAPI-s来完善代码。虽然我现在很困惑,因为给出的唯一示例使用Buzz,并且根据我的实验,Google翻译(v2)api的行为必须与google-api-ruby-client中的Buzz完全不同。.我对“Explorer”演示示例很感兴趣——但据我所知,它并不是一个探索器。它所做的只是调用一个Buzz服务,然后浏览它已经知道的关于Buzz服务的事情。对我来说,Explorer应该让您“发现”所公开的服务和方法/功能,而不一定已经知道它们。我很想听听使用这个

    随机推荐