如何在没有得到的情况下重写(干净利落)?

时间:2010-04-02 21:30:31

标签: c goto control-flow

如果没有得到,我怎么能干净利落?

loop:
  if(condition1){
    something();
  } else if (condition2) {
    somethingDifferent();
  } else {
    mostOfTheWork();
    goto loop;
  }

我也不想使用休息时间。此外,在做其他事情之前,预计会循环几次(前40次),因此即使只是为了可读性,最多的工作部分很可能会尽可能高。提前谢谢。

编辑:这是在错误的概念下发布的,编译器优化器在休息时效果不佳,虽然开始时通常很愚蠢,但事实证明我对自己不正确 通过实验(表现)。另一方面,谢谢你的答案;他们对不同风格的阅读很有趣。

8 个答案:

答案 0 :(得分:10)

bool done = false ;

while( !done ) {
  if(condition1){
    something();
    done = true ;
  } else if (condition2) {
    somethingDifferent();
    done = true ;
  } else {
    mostOfTheWork();
  }
} 

答案 1 :(得分:10)

显然,如果任何一种情况发生,你都会退出循环。

    while ((!condition1) && (!condition2)) {
      MostOfTheWork();
    }
    if (condition1) {
      something();
    } else if (condition2) {
      somethingDifferent();
    }

所以,当两个条件都没有被触发时循环,然后看看哪一个让你。

现在,有人会尖叫我评估的条件超出了我的需要 至。为了他们的利益,修改后的版本:

{
  bool t1, t2;
  while ((!(t1 = condition1)) && (!(t2 =condition2))) {
    MostOfTheWork();
  }
  if (t1) {
    something();
  } else if (t2) {
    somethingDifferent();
  }
}

答案 2 :(得分:2)

没有休息?

function foo(){
  if(condition1){
    something();
    return;
  } else if (condition2) {
    somethingDifferent();
    return;
  }
  mostOfTheWork();
  foo(); //(Tail recursive for those worried about stack overflows)
}

但是,有流量控制的休息时间,它们比goto更清楚,所以我建议使用它们。但是在这种情况下,我会建议@ John的answer作为正确的方法。

答案 3 :(得分:1)

没有笨蛋或喙。一如既往的清洁,主观

 do {
   if ( condition1 )
     something();
   else if( condition2 )
     somethingElse();
   else
     mostOfTheWork();
 } while( !(condition1 || condition2) );

这当然是非常愚蠢的。请休息一下。

答案 4 :(得分:1)

CS教授可能已经把它钻进了你的脑海,这很糟糕,会对你的代码造成严重破坏。如果正确而有目的地使用,Gotos实际上非常有效。这就是为什么大多数编程语言都没有删除它。

在您的特定情况下,goto很好,因为代码块很小,您可以轻松查看程序流程。您也可以使用其他控制结构编写意大利面条代码,尽管这样做有点困难。

答案 5 :(得分:0)

由于您没有具体说明某种语言,因此某些语言可以使用continuenextskip代替goto

答案 6 :(得分:0)

do
{
  if(condition1){
    something();
  } else if (condition2) {
    somethingDifferent();
  } else {
    mostOfTheWork();
  }
} while (!condition1 && !condition2)

答案 7 :(得分:0)

在我看来,这个版本的代码最清楚地将程序流程传达给后代,并且是最容易扩展的。是的,我正在使用break。我无法想到任何真正的理由。

while(true)
{
    if (condition1)
    {
        something();
        break;
    }
    if (condition2)
    {
        somethingDifferent();
        break;
    }
    mostOfTheWork();
}

如果您真的不想使用break,可以使用goto退出循环,或使用return取消该功能(如果这个循环是你必须重构的更大函数的一部分。

while(true)
{
    if (condition1)
    {
        something();
        goto exit;
    }
    if (condition2)
    {
        somethingDifferent();
        goto exit;
    }
    mostOfTheWork();
}
exit:

或者

while(true)
{
    if (condition1)
    {
        something();
        return;
    }
    if (condition2)
    {
        somethingDifferent();
        return;
    }
    mostOfTheWork();
}

如果你拒绝使用除if和while之外的任何流量控制,那么这个怎么样:

bool ok = true;
while(ok)
{
    if (condition1)
    {
        something();
        ok = false;
    }
    if (ok && condition2)
    {
        somethingDifferent();
        ok = false;
    }
    if (ok)
    {
        mostOfTheWork();
    }
}

此外,请参阅my canonical answer了解此类问题(并投票支持!)