【问题标题】:Which one is better? do{} while(0); or goto xy; [closed]哪一个更好?做{} while(0);或转到 xy; [关闭]
【发布时间】:2010-12-13 10:17:10
【问题描述】:

我有两段代码:

一个do while循环:

do
{
    errorflag=0;
    ...
    if(cond1)
    {
        errorFlag=12;
        break;   // Error Conditions
    }
    .
    .            // Processing
    .
    if(cond2)  
    {
        errorflag=56;
        break;
    }
     .
     .

} while (0);

转到标签:

errorflag=0;
if(cond1)
{
     errorflag=12;
     goto xy;
 .
 .
 .
 .
if(Cond2)
{
     errorflag=56;
     goto xy;
}
.
.
.

xy:

哪个更好?请给我详细的为什么?还是有更好的方法来做到这一点?我们正在优化代码。我们最关注的是这类大循环。是组装级别的,优化的空间不大。请提供您的意见。

我不喜欢使用 else-if,因为这又是检查另一个条件的开销。所以有问题直接退出。

我觉得在这个编辑之后我的问题是有道理的

提前致谢

【问题讨论】:

  • 简单的else if 有什么问题?有多少条件?这实际上是什么语言?
  • 这不是一个很好的问题。这就像“哪个更好:用钝勺舀出我的大脑或用坚果饼干压碎我的睾丸”。两者都不好,避免它们!此外,do...while 通常(但不总是)表明您编写了错误的代码。避免它,除非它真的真的很有意义。我知道很多人会不同意这种说法,但我一直发现while...do 结构更容易阅读,而且通常只是...更好。
  • @AlastairG:睾丸被压碎是可以生存的。这显然是更好的选择。话虽如此,我认为我不会滥用 C 控制结构并避免任何一种惩罚。我同意你对do ... while() 的看法,我只是不使用它。
  • @AlastairG:关于我的问题。我有一个块。其中有一系列退出条件,这取决于它所做的处理,就在条件之上。所以使用 while....do 是没有用的,因为它首先检查条件,所以会产生开销。在我们的例子中,它是经常使用的函数。这就是我们使用 do...while 的原因。在我们的案例中是有意义的
  • 一个类似的问题有答案:stackoverflow.com/questions/1412081/…

标签: c coding-style goto do-while


【解决方案1】:

选项 3:

void frobnicate(arguments) 
{
  if (cond1) return;
  if (cond2) return; 

  ...
}

frobnicate(the_arguments)

选择一个有意义的名称,并保持简短。

【讨论】:

  • 虚拟 -1 表示不回答问题。你的 ... 应该在两个 if 之间。
  • 这在很多情况下不起作用(例如当您需要在返回之前进行清理时)
【解决方案2】:

它们生成相同的代码(假设编译器值得考虑),因此区别在于其中一个最容易理解,以及 do/while 是否会干扰其他循环构造。如果有这样的干扰,请使用 goto。否则不要;它们不太清楚(通常)。

并仔细查看你的函数是否过于复杂,是否应该重构为多个函数,目的更明确,控制流程更简单。

【讨论】:

    【解决方案3】:

    真的吗?你没听说过else

    if (cond1)
    {
        //stuff
    }
    else if (cond2)
    {
        // more stuff
    }
    // etc
    
    else
    {
        // default
    }
    

    编辑

    我误读了这个问题。不过,我将在此处保留旧答案,因为 cmets 在其他方面没有意义。

    完全按照问题中的内容进行编码的正确方法是:

    if (!cond1)
    {
        .
        .
        .
        .
    }
    

    在问题的两种情况下,if (cond2) 部分都没有效果(假设 cond2 没有副作用),因为它们都会导致跳转到接下来会执行的语句。这就是我忽略它的原因。

    【讨论】:

    • 为什么投反对票?根据所使用的编程语言和条件的数量,此代码非常简单易读。当然,冗长而复杂的嵌套 if 总是一个很好的重构候选,但在这种情况下,我们知道的太少,无法假设这样的事情。
    • @0xA3:这不是问题的解决方案,这就是原因。
    • 从初始代码来看,基于if的解决方案是if (!cond1) { ... if(!cond2) { ... } }(不需要其他)。
    • @Victor Nicollet:我明白你的意思,我误读了原文。我正在编辑我的答案。
    • @Donald Fellows、@Victor Nicollet、@JeremyP:这里的问题是问题只显示了一个非常没用的代码 sn-p。鉴于条件本身没有副作用,您也可以简单地删除所有代码。但是 OP 已经离开了现场,所以我们不知道代码实际上应该做什么。
    【解决方案4】:

    goto 是邪恶的。只有在绝对没有其他方法可以做到这一点时,您才应该使用gotos。 gotos 可能导致无法预测的意大利面条代码(难以阅读、理解、调试,在维护阶段很容易出错)。

    我相信带有条件 break 语句的无限 while 循环仍然更好,尽管在 while 语句中表达条件时它更具可读性。

    【讨论】:

    • 这里的循环不是无限的。似乎一个简单的else if 会做......(这也显示了这段代码很容易被误读,正如@Victor Nicollet 的评论中已经提到的)
    • @0xA3:理智的声音...
    • 在这种情况下使用 goto 比滥用的 do/break/while 构造要清晰得多。
    • @salva:使用 if 语句会更好。
    • goto是邪恶的”是发烧友向世界提出的教条。仅仅因为它的名字而皱眉头是不好的。其他控制语句也可能导致不可读的代码。仅仅因为goto可以用不好的方式使用,它并不完全是坏的。
    【解决方案5】:

    根据您的问题,此处的选择是do-whilegoto

    我建议你选择do-while

    我不鼓励您使用goto。这将导致您稍后使用意大利面条代码。

    您可以使用 ifif-else 之类的替代方法来得出相同的结果。

    goto说不

    【讨论】:

    • 这是一句废话。你可以在没有goto 的情况下完美地编写意大利面条代码,并且你可以编写包含goto 的干净代码,例如用于错误处理。
    • @glglgl 也适用于错误处理的语言。例如,使用结构化异常处理和finally 子句。如果这是一个足够好的问题,语言会适应以更好地处理它(只要它不会过多地破坏语言)。使用goto 仍然意味着你需要记住在处理错误时跳转到这个特定的标签——使用finally/catch 让你可以像在其他任何地方一样使用return。这在复制代码时尤其重要 - 很容易忘记将 return 更改为 goto releaseStuff;
    • @Luaan 如果您的语言具有适当的异常处理能力,那么确实没有理由使用 goto。但在 C 中,这通常是最简单的。
    猜你喜欢
    • 2012-08-24
    • 2011-03-19
    • 2011-01-05
    • 2010-11-24
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    相关资源
    最近更新 更多