哪一个更好? do {} while(0);或者转到xy;

时间:2010-12-13 10:17:10

标签: c coding-style goto do-while

我有两段代码:

执行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 - 如果从那以后,它再次成为检查一个条件的开销。所以当出现问题时直接退出。

我觉得在这次编辑后我的问题很有意义

提前致谢

6 个答案:

答案 0 :(得分:13)

选项3:

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

  ...
}

frobnicate(the_arguments)

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

答案 1 :(得分:5)

它们生成相同的代码(假设编译器值得考虑),因此差异是其中一个最容易理解,do / while是否会干扰其他循环结构。如果存在此类干扰,请使用gotos。否则不要;他们不太清楚(通常)。

仔细观察你的功能是否过于复杂,应该重构为多个功能,目的更明确,控制流更简单。

答案 2 :(得分:3)

真的?你有没有听说过else

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

else
{
    // default
}

修改

我误解了这个问题。我会在这里留下旧答案,因为这些评论对其他人来说没有意义。

根据问题的确切编码的正确方法是:

if (!cond1)
{
    .
    .
    .
    .
}

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

答案 3 :(得分:2)

答案 4 :(得分:-3)

goto是邪恶的。只有在绝对没有办法执行此操作时,您才应该使用gotogoto可能导致不可预测的意大利面条代码(难以阅读,理解,调试,很容易出现维护阶段的错误)。

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

答案 5 :(得分:-9)

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

我建议您选择do-while

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

您可以使用ifif-else等替代方案来获得相同的结果。

goto

说不