コンピュータプログラミングにおいて、ループとは、コードを繰り返し実行できるようにする制御フロー構造であり、通常は繰り返し実行の間にわずかな変更が加えられます。ループは、コレクション内のすべての項目に対して繰り返し処理を実行したり、長時間実行されるプログラムを実装したりするために使用できます。
ループは高水準プログラミング言語の特徴です。低水準プログラミング言語では、同じ機能はジャンプを使用して実現されます。プログラムが機械語にコンパイルされるとき、ループはジャンプを使用して実現できますが、一部のループはジャンプなしで実行できるように最適化できます。[ 1 ]
通常、ループは有限回の反復で実行されることが想定されています。しかし、適切な注意を払わないと、終了する可能性のないループが意図せず作成されてしまうことがあります。このようなループは無限ループと呼ばれます。プログラムに無限ループが含まれているかどうかを判定する問題は、停止問題として知られています。
条件付きループ(不定ループとも呼ばれる[ 2 ])は、論理条件に基づいて終了するかどうかを決定するループである[ 3 ] 。これらのループは柔軟性があるが、その正確な動作を推論するのは難しい場合がある[ 4 ]。: 368
条件付きループは通常、条件と本体の2 つの部分で構成されます。条件はプログラムの状態に応じて決まる論理式であり、本体は条件が満たされている間実行されるコードブロックです。[ 3 ]
よくある誤解は、条件が満たされなくなったらすぐに本体の実行が終了するというものですが、これは通常そうではありません。 [ 4 ] : 368ほとんどのプログラミング言語では、本体が実行されるたびに条件が一度チェックされます。条件がいつチェックされるかは標準化されておらず、一部のプログラミング言語には、条件が評価されるタイミングに関する異なるルールを持つ複数の条件付きループ構造が含まれています。
事前テストループは、条件がチェックされてから本体が実行される条件付きループです。より正確には、条件がチェックされ、条件が満たされれば本体が実行されます。その後、条件が再びチェックされ、条件が満たされれば本体が再び実行されます。このプロセスは、条件が満たされなくなるまで繰り返されます。多くのプログラミング言語では、このループをwhile ループと呼び、キーワードwhileで参照します。これらは一般的に次のような形式で記述されます。
条件が満たされる間、本体を繰り返す
キーワードdoやrepeatの代わりに、中括弧[ 5 ]や空白[ 6 ]など、本文の開始と終了を示す他の方法が使用されることもあります。
例えば、以下のコード断片では、まずxが5未満かどうかを確認します。実際、5未満なので、ループ本体に入ります。そこでxの値が表示され、1ずつ増加します。ループ本体内のステートメントを実行した後、条件が再度チェックされ、ループが再度実行されます。このプロセスは、xの値が5になるまで繰り返されます。
x ← 0 while x < 5 do display( x ) x ← x + 1 repeat

ポストテストループは、本体の実行後に条件がチェックされる条件付きループです。より正確には、本体が実行された後に条件がチェックされます。条件が満たされている場合は、本体が再度実行され、その後条件がチェックされます。これは、条件が満たされなくなるまで繰り返されます。さまざまなプログラミング言語で使用される構文のため、これはdo-whileループと呼ばれることもありますが[ 7 ] 、 FortranとPL/Iではプレテストループに「DO WHILE」構文を使用するため、混乱を招く可能性があります[ 8 ] [ 9 ]。ポストテストループは、一般的に次のような形式で記述されます。
本体を繰り返す条件を満たす間
キーワードdoやrepeatの代わりに、中括弧などの他の方法を使用して、本文の開始と終了を示すことがあります。 [ 10 ]
言語によっては、このタイプのループに異なる命名規則を使用する場合があります。たとえば、Pascal言語とLua言語には「repeat until 」ループがあり、制御式が真になるまで実行され続け、その後終了します。 [ 11 ] [ 12 ]

C言語で普及した3部構成のforループには、初期化(ループのバリアント)とインクリメントという2つの追加部分があり、どちらもコードブロックです。初期化はループを準備するコードとして意図されており、最初に一度だけ実行されます。インクリメントは、ループの各反復後にプログラムの状態を更新するために使用されます。そうでない場合、3部構成のforループは事前テストループです。これらは一般的に次のような形式で記述されます。
初期化、条件、インクリメントのために、本体を繰り返します。
この構文はB言語から来ており、元々はStephen C. Johnsonによって考案されたものです。[ 13 ]次のC言語のコードは、0から4までの数字を出力する3つの部分からなるループの例です。
for ( int i = 0 ; i < 5 ; i ++ ) { printf ( "%d \n " , i ); }適切に宣言された関数またはメソッドが存在すると仮定するとdo_work()、後テストループをサポートするプログラミング言語では、以下は同等です。[ 14 ]
さらに、continueステートメントが使用されていないことを考慮すると、上記は技術的には以下と同等ですが、これらの例は日常のコンピュータで使用される典型的なまたは現代的なスタイルではありません。[ 15 ] [ 16 ]
while true do do_work() 条件が真 でない場合は、ループを終了してください。
または、
ループ開始: do_work() 条件が満たされた場合、LOOPSTARTへ 移動します。

列挙(確定ループ[ 2 ]とも呼ばれる)は、コレクションのすべての項目を反復処理することを目的としたループです。[ 17 ]条件付きループほど柔軟ではありませんが、予測可能性が高くなります。たとえば、列挙は終了することを容易に保証でき、潜在的なオフバイワンエラーを回避できます。列挙は、暗黙的または明示的にイテレータを使用して実装できます。
プログラミング言語によって、列挙を呼び出すためのさまざまなキーワードが使用されます。たとえば、ALGOLforの派生言語では, [ 18 ]を使用し、 Fortranの派生言語ではdo[ 19 ]を使用し、COBOLPERFORM VARYINGでは. [ 20 ]を使用します。
列挙は、 ZigやRustなどでは「for ループ」と呼ばれることがあります。[ 21 ] [ 22 ]これは、C、C++、Javaなどの最も人気のある[ 23 ]プログラミング言語の多くが、列挙ではない3 部構成の for ループにその用語を使用しているため、混乱を招く可能性があります。 [ 24 ] [ 25 ] [ 26 ] PerlやC#などの他のプログラミング言語では、「foreach ループ」という用語を使用することで、この混乱を回避しています。[ 27 ] [ 28 ]
コレクション内の項目が反復される順序は、プログラミング言語によって異なります。Fortran 95には、キーワードを使用して呼び出されるループがありFORALL、この順序とは無関係です。これにより、ループの各反復が同時に実行されます。この機能はFortran 2018で廃止されました。[ 29 ]
ほとんどの関数型プログラミング言語では、従来のループの代わりに再帰が使用されます。これは、変数が不変であるため、ループのインクリメントステップが発生できないためです。 [ 30 ]
長いループでスタックオーバーフローエラーが発生するのを避けるため、関数型プログラミング言語は末尾呼び出し最適化を実装しており、ループの各反復で同じスタックフレームを使用できるため、実質的にwhileループやforループと同じコードにコンパイルされます。[ 31 ]
Haskellなどの一部の言語には、リスト内包表記と呼ばれる構文があり、これは列挙に似ており、リストの内容を反復処理して新しいリストに変換します。
ループカウンタは、ループの反復回数を制御する制御変数です。ループカウンタはループの反復ごとに変化し、各反復ごとに固有の値を提供します。ループカウンタは、ループを終了するタイミングを決定するために使用されます。この構造のほとんどの使用例において、変数が整数値の範囲をとることから、この名前が付けられました。
一般的な識別子命名規則では、ループカウンタに変数名i、j、k (必要に応じて以下同様)を使用します[ 32 ] 。ここでi は最も外側のループ、j は次の内側のループなどです。このスタイルは、一般的に Fortran の初期プログラミングに由来すると考えられています。これらの文字で始まる変数名は暗黙的に整数型として宣言されていたため、一時的にしか必要とされないループカウンタには当然の選択肢でした。この慣習はさらに遡り、加算や乗算のインデックスがi、j、kである数学的表記法に由来します。
ループカウンタにiやjのような簡潔な名前を使用することは、変数の目的がより長く、より説明的な名前が付けられている場合ほど明確ではないため、一部の人からは推奨されていない。[ 4 ]: 383-382
言語によって、ループ終了時にループカウンタが保持する値に関するルールは異なり、中には未定義となるものもあります。そのため、コンパイラはループカウンタに任意の値を保持するコードを生成したり、ループ値がレジスタに保持されていてメモリに格納されていないため値を変更しないコードを生成したりすることが可能になります。実際の動作は、コンパイラの最適化設定によっても異なる場合があります。
ループ本体内でループカウンタを変更すると、予期せぬ結果を招く可能性があります。このような問題を回避するため、一部の言語ではループカウンタを不変にしています。しかし、コンパイラが検出できるのは明示的な変更のみです。ループカウンタのアドレスがサブルーチンへの引数として渡されるような状況では、言語がプロシージャシグネチャと引数インテントをサポートしていない限り、ルーチンの動作は一般的にコンパイラには不明なため、チェックが非常に困難になります。
一部の言語では、ループの反復処理の進行方法を変更するための補助的なステートメントも提供されている場合があります。これらの一般的なものとしては、プログラムが現在実行中のループを終了するbreakステートメントと、現在のループの次の反復処理にスキップするcontinueステートメントがあります。 [ 4 ] : 379これらのステートメントには別の名前が付けられている場合もあります。たとえば、Fortran 90では、 exitとcycleと呼ばれます。
ループは、実行中の関数から戻ることによっても終了させることができます。
ネストされたループの場合、break文とcontinue文は最も内側のループに適用されます。一部のプログラミング言語では、ループにラベルを付けることができます。ラベルを付けたループには、プログラムがネストされているすべてのループに適用できます。
outer_loop: (これは最も外側のループのラベルです) for 1 ≤ i ≤ 2 do for 1 ≤ j ≤ 2 do display(i, j) i = 2 の場合、外側のループ を続行します。繰り返しループを繰り返します(このネストされたループは、ペア (1, 1)、(1, 2)、および (2, 1) を表示します)。
無限ループとは、決して終了しないループのことです。これは意図的な場合もあれば、論理エラーの結果である場合もあります。
無限ループを体系的に検出することは、停止問題として知られています。
無限ループは、 Webサーバーなど、プログラムが終了するまで繰り返し計算を実行する必要があるアプリケーションで役立ちます。[ 33 ]
ジョンソンのセミコロンを使ったforループを見て、それを[B]に入れた。盗んだんだ。