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 の回答を正しい方法としてお勧めします。

于 2010-04-02T21:35:39.220 に答える
1

あなたはおそらく、CS の教授によって、それは悪いことであり、コードに大混乱をもたらすだろうと頭を悩ませたことがあるでしょう。Goto は、適切かつ意図的に使用すると、実際には非常に効率的です。これが、ほとんどのプログラミング言語がそれを削除していない理由です。

特定のケースでは、コードのブロックが小さく、プログラムの流れを簡単に確認できるため、goto は問題ありません。少し難しいですが、他の制御構造を使ってスパゲッティ コードを書くこともできます。

于 2010-04-03T02:42:02.883 に答える
1

後藤やくちばしはありません。いつものように清潔感がなく、主観的

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

もちろん、これは信じられないほどばかげています。ちょうど休憩を使用してください。

于 2010-04-02T21:42:14.247 に答える
0

私の意見では、このバージョンのコードはプログラムの流れを後世に最も明確に伝え、最も簡単に拡張できます。はい、使用してbreakいます。断る本当の理由が思い浮かびません。

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

本当に を使用したくない場合は、 を使用してループから抜け出すか、 を使用して関数を抜け出すbreakことができます(このループがより大きな関数の一部である場合は、リファクタリングする必要があります)。gotoreturn

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 に答える
0

言語について具体的ではなかったので、一部の言語にはcontinuenextまたは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 に答える