66

重複の可能性:
forループまたはwhileループで繰り返しますか?
Cでループ-for()またはwhile()-どちらがベストですか?

forループの代わりにループを使用する必要があるのはwhileいつですか?

次のループは、構文を除いて同じだと思います。もしそうなら、なぜどちらかを選択するのですか?

int i;
for (i = 0; i < arr.length; i++) {
  // do work
}

int i = 0;
while (i < arr.length) {
  // do work
  i++;
}
4

28 に答える 28

104

あなたの場合、forループ内のコード行が1行少なくなる以外はあまり得られません。

ただし、次のようにループを宣言すると、次のようになります。

for(int i = 0; i < x; i++)

iコードの残りの部分にエスケープさせるのではなく、ループのスコープ内にとどまることができます。

また、whileループでは、変数宣言、条件、および増分が3つの異なる場所にあります。forループを使用すると、すべてが1つの便利で読みやすい場所にあります。

最後の考え:
もう1つの重要な注意事項。2つの間に意味上の違いがあります。一般に、whileループは、反復回数が不定であることを意味します。(つまり、ファイルが読み取られるまで..ファイルの行数に関係なく)、forループにはより明確な反復回数が必要です。(コレクション内のすべての要素をループします。コレクションのサイズに基づいてカウントできます。)

于 2010-10-06T17:14:49.713 に答える
86

for選択する理由が1つありますwhile。読みやすさです。

ループを使用することによりfor、初期化、「ステップ」操作、および完了条件を必要とするある種の操作を実行することを意図していることを明確に示しています。

while一方、を使用すると、完了条件が必要であるとだけ言っていることになります。

于 2010-10-06T17:14:14.770 に答える
37

ファイルから読み取りを行っていて、EOFに到達するのを待っている場合など、必ずしもカウンターが必要ない場合は、「while」を使用します。この場合、「for」は最良の選択肢ではない可能性があります。配列上のアイテムを調べるときは、意図をよりよく伝えるため、「for」を使用したいと思います。

于 2010-10-06T17:14:09.083 に答える
27

for()ループとwhile()ループの注目すべき違いの1つは、while()ループの「continue」ステートメントがループの先頭に分岐するのに対し、for()ループの1つは3番目の部分に分岐することです。 for()句の[条件の後の句。通常は変数をバンプするために使用されます]。

于 2010-10-06T17:49:16.407 に答える
16

教師として、私はこれをさまざまな形や形で考えてきました。私の提案は常に要約されます

  • for-ループはカウント用です。カウントアップ、カウントダウン。
  • while/do-while構成は、他のすべての条件用です。 c!=EOFdiff<0.02など。イテレータ/列挙子は、forループに非常に適したカウンタです。

つまり、あなたint=0; while( ... )は私の目に恐ろしいです。

于 2010-10-06T19:04:35.783 に答える
15

なぜペプシよりもコーラを選ぶのですか?

WHILEループとFORループの間では、これらを交換して使用できます。純粋主義者になるために、あなたは条件の性質に基づいてあなたの決定を下すことができます。カウントベースのループを実行している場合は、FORループが最も理にかなっています。

for( cur = 0; cur < myList.Length; cur++ ){
    doSomething( myList[cur] );
}

ロジックベースのループを実行している場合、WHILEは最もクリーンな実装になります

Iterator i = myObject.getIterator();
while( i.hasNext() ){
    doSomething( i.next() );
}
于 2010-10-06T18:01:29.690 に答える
7

あなたが言うように、理由はパフォーマンスではなく、意味的で美的です(それらのコンパイルされたコードは非常に似ている傾向があります)。

とは言うもののfor、反復回数がわかっているサイクルでは通常ですがwhile、条件がサイクル内で行っていることと必ずしも相関していないこと、または最初に何回の反復が行われるかわからないことを意味しますなれ。

于 2010-10-06T17:16:36.943 に答える
7

一般に、ループのメンテナンスを1つの場所にローカライズするため、ループがカウントとは関係がない場合でも、ループを使用することを常に好みます。他の誰かがやって来てループを追加/変更することを決定したとき、彼らがFORループを使用している場合、変更を行う人は、FOR式内の項目を台無しにしない限り、一般にそれを確信できます。 、ループ内の反復を中断することはありません。

ただし、whileループのようなものでは、プログラマーがループ本体を完全に解析し、それがどのように繰り返されるかを理解して、変更を加えたときにループ保守コードを変更せずに正しい順序に保つ必要があります。

したがって、FORの中央部分のみが効果的に必要な場合にのみWHILEを使用します

于 2010-10-07T02:30:43.757 に答える
4

これらは機能的には同じですが、すべてのループ機能が一緒になっているため、forループはエラーが発生しにくいと言えます。iの宣言、while宣言、およびインデックスイテレータを区切る行が複数ある場合は、忘れたり、使用方法に混乱したりする可能性があります。もちろん、これはすべて主観的なものです。

于 2010-10-06T17:15:37.193 に答える
3

それらは通常、同じ最終結果にコンパイルされます。ほとんどの場合、私はfor'sまたはfor-を好みます。書き込み

for (;x<5;x++){ 
    //do work 
} 

それほど不吉ではありませんが、書く

while(x<5){
    x++
    //do work
}

それ以外の

while(x<5){
    //do work
    x++
}

一部の人を混乱させ、1つずつエラーを引き起こす可能性があります。

于 2010-10-06T17:15:30.417 に答える
3

プログラミングの初期には、一般的なデータ構造は線形配列(別名ベクトル)であり、繰り返しパターンは配列の各要素をトラバースして使用することでした。このシナリオでは通常、言語にこのパターンの特定の構文であるforループが含まれていました。この歴史的遺産とは別に、whileループを大丈夫に使用できます(最近では、F#のような関数型言語では、List.mapまたはList.foldを使用したいです;-)

于 2010-10-06T17:16:52.957 に答える
3

これは主に読みやすさの問題です。一般に、反復する値の範囲が定義されている場合は、forループを使用します。反復していないとき、または終了条件がいつ真になるかわからないときに、whileループを使用します。

Javaの観点からは、forループはコレクションに非常に便利です。

for (Object o : objects){
    o.process();
}

以下よりもはるかに読みやすいです:

int i=0;
while(i < objects.size()){
    objects.get(i).process();
    i++;
}
于 2010-10-06T17:17:59.990 に答える
3

Pascalのような言語では、forとwhileの構成にはさまざまなアプリケーションがありました。次のように、Pascalでforループを記述します。

for i := 1 to 5 do
begin
{ some code here }
end

したがって、iが1ずつインクリメントされることを明示的に指定します。ここでは、明示的に指定された終了条件はありません。したがって、forループは、実際のループ実行が開始される前に、ループが特定の所定の回数実行されることがわかっている場所でのみ使用できます。一方、whileループの場合は、明示的な終了条件を指定できます。

i:=0;
while (i<>5) do
begin
{ some code here }
i:=i+1;
end

したがって、whileループははるかに柔軟です。後でCが開発されたとき、forとwhileはサポートされていましたが、for構文の意味が変更され、ブール演算子を使用して明示的な終了条件を追加できました。したがって、C言語とC言語のwhileとforの能力は同じであり、したがって、使いやすさの問題というよりも読みやすさの問題になります。

于 2010-10-07T02:23:05.703 に答える
2

他の(非常に良い)答えを一瞥して、私が作られているのを見なかった点があります。(もしそれが作られたのなら、私はそれを見逃して謝罪しました。)

一見意味的に同一のコードの2つのスニペットを提供します。

スニペット#1:

for (int a = 0; a < arr.length; a++) {
  /* do some work here */
}

スニペット#2:

int b = 0;
while (b < arr.length) {
  // do work
  b++;
}

彼らは同じことをしているように見えますよね?次に、各スニペットに1行追加して、何が起こるかを見てみましょう。

スニペット#3:

for (int c = 0; c < arr.length; c++) {
  /* do some work here */
}
printf("%d\n", c);

スニペット#4:

int d = 0;
while (d < arr.length) {
  // do work
  d++;
}
printf("%d\n", d);

したがって、これらの4つのスニペットが埋め込まれたジャンクファイルをコンパイルすると(さらに、arr.lengthが何かを意味するように接着剤を使用すると)、次のエラーが発生します。

$ clang junk.c
junk.c:20:17: error: use of undeclared identifier 'c'
        printf("%d\n", c);
                       ^
1 diagnostic generated.

ループを使用するforと、ダミーのカウンター変数などにより多くの局所性を提供できることがわかります。これにより、衝突の可能性なしに変数名を再利用する際の余裕が広がります(ただし、シャドウイングの可能性が高くなります)。

于 2010-10-07T03:53:54.827 に答える
1

読みやすさ。そして昔のVBから6日間のウェンドからしばらく見たら泣きたい。

ループを使用するとよい場合があります。true / falseを返すが、そのオブジェクト内の値を繰り返すオブジェクトで関数を呼び出す。

C#のDataReaderの例:

List<string> strings = new List<string>();
while(DataReader.Read())
{
  strings.Add(DataReader["foo"].ToString());
}

forループを使用すると、作業を関数内にカプセル化できるため、メモリ管理が向上します。また、whileループにエラーがあると、すべての生命を脅かす制御不能なループに巻き込まれる可能性があります。

bool keepGoing = true;
while(keepgoing)
{
   try
   {
     //something here that causes exception, fails to set keepGoing = false;
     keepGoing = false;
   }
   catch(Exception)
   {
    //Do something, but forget to set keepGoing.
    //maybe there is always an exception...
   }

}

また、それは単なる一般診療だと思います。建設と同じように。間柱に屋根のフラットを置くために釘を使用します。あなたはネジを「使うことができた」、彼らは同じ仕事をするだろう、しかしそれはただ一般的な習慣ではない。

誰もそれが間違っていると言っているのではなく、「コーディングの世界を機能させ続けるために、仲間のプレッシャーの下で折りたたんでください」と言っているだけです。

于 2010-10-06T18:42:34.747 に答える
1

簡単に言えば:

'for'ループは、繰り返し使用するために使用される傾向があります。配列を反復処理する必要があります。さまざまな理由から、1から100(またはその他の範囲)の数値が必要です。

'while'ループは、条件付きループになる傾向があります。あなたは、条件が偽になるまで何かをし続けたいと思っています。「トースト」というクラスがあり、トーストが焼けるまでトーストを調理したいとすると、次のようになります。

while (!toast.isToasted) cook(toast);

ほとんどの場合(できない例は考えられません)、forループをwhileループとして記述し、whileループをforループとして記述できますが、最初に最適なものを選択すると、通常、状況は私の結果になります。上記の点。

于 2010-10-07T12:30:18.427 に答える
1

一般に、whileループとforループの違いは構文であり、パフォーマンスには関係ありません。とは言うものの、この質問はすでにJavaで対処されているようです:Javaforループとwhileループ。パフォーマンスの違いは?

于 2010-10-06T17:17:50.973 に答える
1

いずれかを決定し、プロジェクト全体でコピーして貼り付け/調整するだけです。意思決定が減り、タイピングが減り、コーディングが速くなります。パフォーマンスの違いはごくわずかです。

また、私はジャスティンiがループの範囲を維持しているわけではなく、ループの var aL = array.length外側でも使用しています。次に、ループコンストラクター内でiandを使用して、ヒットごとに配列の長さを再計算しないようにします(varの作成を何度も繰り返します;))。再び否定します。非常に大きなアレイが飛び回っていない限り、パフォーマンスは本当に(私の答えの最初のビットを参照)。配列の長さを事前に知っている場合は、最初に固定長で開始します(これがクライアント側であり、大量のデータがある場合は、最初に固定長で開始します(くだらないブラウザでのメモリ割り当てについては少し助けてください))。aLfor

jsの例

<script>
var i=0;
var myArray = ["D","R","Y"];//literal style will do for now;)
var aL=myArray.length; //or use 3 if known upfront
for(i;i<aL;i++){/*always do DRY things here*/}
</script>

また、条件が満たされたときに、「ループ全体を完了する必要がありますか?」と自問してください。できるだけ早くループから抜け出すことを忘れないでください。

于 2010-10-06T21:05:18.787 に答える
1

forwhileループの間には意味上の違いがあります。forループの場合、反復回数は事前に定義されていますが、ループのwhile場合は必要ありません。

一部の言語(Adaなど)は、forループカウンターをループ本体内で定数にすることにより、これを強制します。したがって、たとえば次のように言うことは違法です。

for i in values'range loop
   ...
   i := i + 1;   -- this is illegal, as i is a constant within the loop body
end if;

forただし、このセマンティックの違いは、ループカウンターを定数として扱わないほとんどの言語ではそれほど明確ではありません。

于 2010-10-06T23:34:04.863 に答える
1

関連する雑学:

Googleの新しいGo言語では、 whileステートメントを含めないことを決定しました。代わりに、条件句のみを持つforステートメントを記述できます。したがって、

while (a < b) { ... }

単に

for a < b { ... }
于 2010-10-07T09:33:23.997 に答える
1

読みやすさは非常に重要なポイントですが、両方の方法で機能します。forループをwhileループに変換します。カウンター変数を使用している場合でも、そうでなければ「自然に」使用できる場合でも、そのように読みやすくなります。これは、forの3つの部分または複数のカウンター(複雑であることに関連している)のいずれかに長いまたは複雑な式がある場合に一般的です。

Knuthのループと半分は、いくつかの言語では、forループではなく、ブレークのある無限ループとしてもうまく機能します。

ただし、非常に重要なセマンティックの違いがあります。

for (int i = 0; i < arr.length; i++) {
  if (filter(arr[i])) continue;
  use(arr[i]);
}

int i = 0;
while (i < arr.length) {
  if (filter(arr[i])) continue;
  use(arr[i]);
  i++;
}
于 2010-10-07T13:10:57.893 に答える
0

1つの理由は、whileの条件が文字列である可能性があることです。

また、ミックスに「Do」を追加すると、現在の状態に関係なく、操作を少なくとも1回実行するときに、dowhileループを使用できます。

于 2010-10-07T08:55:10.123 に答える
0

後者は1つのライナーになる可能性があるため:while(++ i <arr.length){//動作する}

于 2010-10-07T04:27:04.870 に答える
0

必要に応じてforループを使用します。whileソリューションには構文上の欠点があり(長い)、ループ内で呼び出しを続行する前に、iをインクリメントすることを確認する必要があります。

于 2010-10-06T17:14:17.063 に答える
0

好み。私の場合、すべてのループロジックがforステートメントに組み込まれているため、実際のループでカウンター変数を宣言したり、インクリメント/デクリメントを実行したりする必要はありません。また、forステートメントに対してローカルのカウンター/インデックスを宣言できます。

于 2010-10-06T17:14:49.853 に答える
0

forループは、多くの場合、並列化する方が簡単です。プログラムは、実行される反復回数とイテレータの値を任意の時点で事前に通知できるため、OpenMPなどのAPIを使用した並列化は簡単です。もちろん、休憩を取り、続行し、イテレータを手動で変更すると、この利点はなくなります。

于 2010-10-06T20:19:51.383 に答える
0

反復の正確な数がわかっている場合は一般的にforループを使用し、一般的に条件を確認する場合はwhileループを使用するのが私のロジックです。その後、要件に従ってそれらを使用します。それ以外の場合は、両方とも同じ動作を示します。

于 2010-10-07T12:16:02.577 に答える
0

whileループ、次のように定義されます

while(condition)

このプログラミングパターンを表します。

1:
if(!condition) goto 2;
...
goto 1;
2:

一方、forループは、次のように定義されます。

for(var i = seed; condition; operation)

このパターンを表します:

var i = seed
1:
if(!condition) goto 2;
...
operation;
goto 1;
2:

どちらのパターンも非常に一般的に使用されているため、名前が付けられ、言語に組み込まれています。

ループを制御するためにカウンターを定義する必要がある場合は、forループを使用してください。そうでない場合は、whileループを使用します。

于 2010-10-08T06:52:56.857 に答える