4

如果没有 goto,我怎么能干净地做到这一点?

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

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

编辑:这是在编译器优化器在中断时工作不佳的误解下发布的,虽然一开始通常很愚蠢,但通过(性能)实验证明我自己是不正确的。另一方面,感谢您的回答;他们对不同风格的读物很有趣。

4

8 回答 8

10
bool done = false ;

while( !done ) {
  if(condition1){
    something();
    done = true ;
  } else if (condition2) {
    somethingDifferent();
    done = true ;
  } else {
    mostOfTheWork();
  }
} 
于 2010-04-02T21:35:24.993 回答
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();
  }
}
于 2010-04-02T21:36:10.190 回答
2

没有休息?

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

但是,中断用于流量控制,它们比 goto 更清楚它们的作用,所以我建议使用它们。但是在这种情况下,我会推荐@John's answer作为正确的方法。

于 2010-04-02T21:35:39.220 回答
1

没有 gotos 或喙。一如既往的不干净,主观

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

这当然是非常愚蠢的。只需要休息一下。

于 2010-04-02T21:42:14.247 回答
1

您可能已经被 CS 教授钻进了您的脑海,这很糟糕,并且会对您的代码造成严重破坏。如果使用得当且有目的地使用,Goto 实际上非常有效。这就是为什么大多数编程语言都没有放弃它的原因。

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

于 2010-04-03T02:42:02.883 回答
0

由于您没有具体说明一种语言,因此某些语言具有continue,next或者skip您可以使用它来代替goto.

于 2010-04-02T21:36:17.470 回答
0
do
{
  if(condition1){
    something();
  } else if (condition2) {
    somethingDifferent();
  } else {
    mostOfTheWork();
  }
} while (!condition1 && !condition2)
于 2010-04-02T21:36:18.737 回答
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();
    }
}

另外,请参阅我对此类问题的规范答案(并投票!)

于 2014-07-02T19:57:28.840 回答