2011-02-06 20 views
7

Douglas Crockfodは通常、ループ内のcontinueをリファクタリングする方が良いと言います。なぜループの内部は悪い考えですか?

ループ内で引き続き悪いとみなされるのはなぜですか?

+0

見るために参照されている(http://stackoverflow.com/ここに理由がいくつかの実用的な理由があります質問/ 1133408/continue-in-nested-while-loops)。 C#固有のものはほとんどありません。そこに提供される回答の多くは優れています。 –

答えて

1

continueの効果は、何とかループの始めにgotoに相当します。したがって、gotoのように、コードを理解しにくくします。

+7

-1 'if(...){...} ...'はブロックの最後まで 'goto'といくらか匹敵します。真に、「goto」の特殊なケースに遠隔的に似ているものを無意識に無視することは、不適当な制御構造の酷い悪用ほど有害である(例えば、手元の問題に対するより高いレベルの制御構造が存在する場合にはgotoを用いる)。 – delnan

+0

@delnan下向き条件分岐と上向き非条件分岐の間にはかなりの違いがあります。複雑なアセンブリコードを読んだら、その理由を知ることができます。つまり、 'goto'を使うことは実際には受け入れられるかもしれませんが、非条件分岐の場合にのみ下向きです。それは常に上方に枝分かれするように、設計によって壊れている 'continue'とは異なります。 'continue'の存在は、常に正しく書かれていないループを示すものであり、それを使用しているすべてのループをより良い方法で書き直すことができます。 – Lundin

7

continueの使用は、whileに記載された条件が不十分であることを意味します。

代わりに、ループwhileの中にifを使用するか、条件をループのwhileに追加する必要があります。

+2

+1 *これは、 'continue'(ほとんどの場合*、すべてではない*)を避ける(唯一の)理由です。 – delnan

+0

-1 "ifが良かったから"と言っても、質問には全く答えられません。 – twiz

4

ループ本体内のgoto、break、continue、throw、またはreturnを使用すると、すべて望ましくない効果も生じる可能性があります。ループ制御とループ本体が密接に織り込まれている別の例を次に示します。前と同じように1、2、3を書きますか?本気ですか?

int value = 1; 
    for (;;++value) 
    { 
     cout << value << endl; 
     if (value != 4) 
      continue; 
     else 
      break; 
    } 

ループ本体の中でリターンステートメントを使用しないようにアドバイスすることは熱心です。それは本当に意味ですか?ええ、やりますよ。何かを返す関数は、関数の最後に1つのreturn文を使用しなければなりません。

Link

免責事項::ない私の材料、私は[ながら、ネストされたループで続行]もバックソース

関連する問題