4

我有两段代码:

一个 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,因为这又是检查另一个条件的开销。所以有问题的时候直接退出。

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

提前致谢

4

5 回答 5

13

选项 3:

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

  ...
}

frobnicate(the_arguments)

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

于 2010-12-13T10:21:23.173 回答
5

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

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

于 2010-12-13T10:22:38.060 回答
3

严重地?你没听说过else吗?

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

else
{
    // default
}

编辑

我误读了这个问题。不过,我将在此处保留旧答案,因为否则评论没有意义。

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

if (!cond1)
{
    .
    .
    .
    .
}

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

于 2010-12-13T10:32:41.980 回答
-3

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

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

于 2010-12-13T10:20:52.760 回答
-9

根据您的问题,这里的选择是do-whileand goto

我建议你选择do-while.

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

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

说不goto

于 2010-12-13T11:27:24.050 回答