ループ(文)

コードを繰り返し実行するための制御フロー文

コンピュータプログラミングにおいてループとは、コードを繰り返し実行することを可能にする制御フロー であり、通常は繰り返しの間にわずかな変更が加えられます。ループは、コレクション内のすべての項目に対して繰り返しアクションを実行したり、長時間実行されるプログラムを実装したりするため に使用できます。

概要

ループは高水準プログラミング言語の機能です低水準プログラミング言語では、ジャンプ命令を用いて同じ機能を実現します。プログラムを機械語コンパイルすると、ループはジャンプ命令を用いて実現できますが、一部のループはジャンプ命令を使わずに実行するように最適化できます[要出典]

通常、ループは有限回の反復で実行されることが想定されています。[要出典]適切な注意を払わないと、終了する可能性のないループが誤って作成される可能性があります。このようなループは無限ループと呼ばれます。プログラムに無限ループが含まれているかどうかを判定する問題は、停止問題として知られています。

条件付きループ

条件付きループ不確定ループとも呼ばれる[1])は、論理条件に基づいて終了するかどうかを決定するループです。[2]これらのループは柔軟ですが、正確な動作を推論するのが難しい場合があります。[要出典]

条件付きループは通常、条件本体の2つの部分で構成されます。条件はプログラムの状態に応じて実行される論理文であり、本体は条件が満たされている限り実行されるコードブロックです[2]

よくある誤解として、条件が満たされなくなるとすぐに本体の実行が終了するというものがありますが、これは通常そうではありません。 [3] : 368 ほとんどのプログラミング言語では、本体の実行ごとに条件が1回チェックされます条件がチェックされるタイミングは標準化されておらず、一部のプログラミング言語には、条件を評価するタイミングに関する異なるルールを持つ複数の条件付きループ構造が含まれています。[要出典]

事前テストループ

事前テストループは、条件付きループの一種で、本体の実行前に条件がチェックされます。より正確には、まず条件がチェックされ、条件が成立すれば本体が実行されます。その後、再び条件がチェックされ、条件が成立すれば本体が再度実行されます。このプロセスは、条件が成立しなくなるまで繰り返されます。多くのプログラミング言語では、このループをwhile ループと呼び、キーワードwhileを用いて参照します。一般的には、以下のような形式で記述されます。

while 条件 do
    本体
繰り返し

キーワードdorepeatの代わりに、中括弧[4]空白[5]などの他の方法が本文の開始と終了を示すために使用されることがあります

例えば、次のコードフラグメントは、まずx が5 未満かどうかを確認します。x が 5 未満であれば、本体処理に入ります。そこでxが表示され、1 ずつ増加します。本体処理内のステートメントを実行した後条件が再度チェックされ、ループが再度実行されます。この処理は、x の値が 5 になるまで繰り返されます。

x ← 0
 while  x < 5 display 
    ( x )
     xx + 1
繰り返し

ポストテストループ

Do-Whileループのフロー図

事後テストループは、本体の実行後に条件がチェックされる条件付きループです。より正確には、本体が実行され、その後条件がチェックされます。条件が成立する場合は、本体が再度実行され、条件がチェックされます。これは、条件が成立しなくなるまで繰り返されます。これはdo-whileループと呼ばれることもありますが[要出典]Fortranでは事前テストループに「DO WHILE」という構文が使用されるため、混乱を招く可能性があります。 [6]事後テストループは、一般的に次のような形式で記述されます 。


    条件が満たされている間、本文を
繰り返し 実行する  

キーワードdorepeatの代わりに、中括弧などの他のメソッドが本文の開始と終了を示すために使用されることがあります。 [7]

一部の言語では、このタイプのループに異なる命名規則が使用される場合があります。例えば、Pascal言語とLua言語には「repeat until 」ループがあり、制御式が真になるまで実行を続け、その後終了します。

3部構成の for ループ

5 つのアスタリスクを出力する for ループのフロー図。

C言語で普及した3部構成の for ループには、初期化ループバリアント)とインクリメントという2つの追加部分があり、どちらもコードブロックです。初期化はループの準備として最初に一度実行されるコードであり、インクリメントはループの各反復後にプログラムの状態を更新するために使用されます。それ以外の場合、3部構成の for ループは事前テストループです。これらは通常、次のような形式で記述されます。

 初期化条件増分 本体繰り返し
    

この構文はBから来ており、もともとはStephen C. Johnsonによって発明されました[8]

次の C コードは、0 から 4 までの数字を出力する 3 つの部分からなるループの例です。

for ( int i = 0 ; i < 5 ; i ++ ) { printf ( "%d \n " , i ); }         
     

同等の構成要素

何らかの作業を行うdo_work()という関数があると仮定すると、以下は同等です。[引用が必要]

する
    do_work()
 条件を繰り返す 
do_work()
条件が満たされている間 、do 
    do_work()
繰り返す

continueステートメントが使用されない限り、上記は技術的には次と同等です (ただし、これらの例は日常のコンピューターで使用される典型的なスタイルや最新のスタイルではありません)。

 真実は そうである
    do_work()
     条件が でない場合
        中断し
    、繰り返し
ます

または

ループスタート:
do_work()
 条件が 成立したら
     LOOPSTART
へ進み、終了したら

列挙

foreachループは、ほとんどの場合、要素のシーケンス内の項目を反復処理するために使用されます。

列挙型確定ループ[1]とも呼ばれる)は、コレクション内のすべての項目を反復処理するループである。[9]条件付きループほど柔軟ではないが、より予測可能である。[要出典]例えば、列挙型は終了することを保証しやすく、潜在的なoff-by-oneエラーを回避することができる。[要出典]列挙型は、暗黙的または明示的に反復子を使用して実装できる。列挙型は、一般的に次のような形式で記述される。

 コレクション本体の繰り返し  アイテム
    

プログラミング言語によって、列挙を呼び出すためのキーワードは異なります。例えば、ALGOL系の言語では[10]forFortran系の言語では[ 11]COBOL系の言語では[12]が用いられますdoPERFORM VARYING

列挙型は、 ZigRustなどでは「forループ」と呼ばれることもあります[13] [14]これは混乱を招く可能性があります。なぜなら、C、C++Javaなど、多くの人気プログラミング言語[15]では、列挙型ではない3つの部分からなるforループ[16] [17] [18]を指す用語として「forループ」を使用しているからです。PerlやC#などの他のプログラミング言語では、 「 foreachループ」という用語を使用することで、この混乱を回避しています。[19] [20]

コレクション内の項目を反復処理する順序は、プログラミング言語によって異なります。Fortran 95には、キーワード を用いて呼び出されるループがありFORALL、これはこの順序とは独立しています。これは、ループの各反復処理を同時に実行する効果があります。この機能はFortran 2018で廃止されました。[21]

関数型プログラミングによるループ

ループカウンター

ループカウンタは、ループの反復を制御する制御変数です。ループカウンタはループの各反復ごとに変化し、各反復に固有の値を提供します。ループカウンタは、ループをいつ終了するかを決定するために使用されます。この構造を使用するほとんどのケースでは、変数が整数値の範囲を取るため、このように呼ばれています。

一般的な識別子の命名規則では、ループカウンタは変数名ijk(必要に応じて以下同様)を使用します[22]。ここで、i は最も外側のループ、j は次の内側のループなどになります。このスタイルは、一般的に Fortran の初期のプログラミング言語[要出典]に由来するとされています。これらの文字で始まる変数名は暗黙的に整数型として宣言されていたため、一時的に必要なループカウンタには当然の選択でした。この慣習はさらに数学表記法にまで遡り、合計乗算インデックスはijkになることがよくあります

ループカウンタにijのような簡潔な名前を使うことは、変数の目的が、より長く説明的な名前を与えられた場合ほど明確ではないため、一部の人々からは推奨されていません。[3] : 383–382 

言語によって、ループ終了時にループカウンタが保持する値は異なります。実際、ループカウンタの値は未定義値になるという規則を定めている言語もあります。これにより、コンパイラはループカウンタに任意の値を残すコードを生成することが可能になります。あるいは、ループカウンタの値がレジスタに保持され、メモリには格納されなかったため、カウンタの値を変更しないコードを生成することもあります。実際の動作は、コンパイラの最適化設定によっても異なる場合があります。

ループ本体内でループカウンタを変更すると、予期せぬ結果につながる可能性があります。このような問題を防ぐため、一部の言語ではループカウンタを不変としています。しかし、コンパイラが検出できるのは、明らかな変更のみである可能性が高いです。ループカウンタのアドレスがサブルーチンの引数として渡される状況では、言語が手続きシグネチャと引数の意図をサポートしていない限り、ルーチンの動作はコンパイラにとって一般的には予測不可能であるため、チェックが非常に困難になります。

早期退出と継続

一部の言語では、ループの反復処理の進行方法を変更するための補助文も提供されています。一般的なものとしては、プログラムが現在実行中のループを終了するbreak文と、現在のループの次の反復処理に進むcontinue文があります。 [3] : 379 これらの文は他の名前で呼ばれる場合もあります。例えば、 Fortran 90ではexit文cycle文と呼ばれます[要出典]

ループは、それが実行されている関数から 戻ることによって終了することもできます。

ネストされたループの場合、break文とcontinue文は最も内側のループに適用されます。一部の言語ではループにラベルを付けることができます。これらの文は、プログラムがネストされている任意のループに適用できます。

outer_loop: (これは最も外側のループのラベルです) 
for 1 ≤ i ≤ 2 do 
    for 1 ≤ j ≤ 2 do
        ディスプレイ(i, j)
        if i = 2
             contine outer_loop
         end if 
    repeat 
repeat 
(このネストされたループは (1, 1)、(1, 2)、(2, 1) のペアを表示します)

無限ループ

参照

参考文献

  1. ^ ab Samanta, Debasis; Sarma, Monalisa (2023年6月15日). Joy with Java: Fundamentals of Object Oriented Programming. Cambridge University Press. p. 124. ISBN 978-1-009-21190-1
  2. ^ ab 「条件ループ - 計算構造 - ナショナル4 コンピューティングサイエンス改訂版」BBC Bitesize . 2021年10月19日時点のオリジナルよりアーカイブ。 2026年1月8日閲覧
  3. ^ abc McConnell, Steve (2004年6月9日). Code Complete. Pearson Education. ISBN 978-0-7356-3697-2
  4. ^ “while文(GNU C言語マニュアル)”. www.gnu.org . 2024年7月12日時点のオリジナルよりアーカイブ。 2026年1月8日閲覧
  5. ^ “3. An Informal Introduction to Python”. Pythonドキュメント. 2025年12月31日時点のオリジナルよりアーカイブ。 2026年1月8日閲覧
  6. ^ 「DO WHILE (FORTRAN 77 Language Reference)」. docs.oracle.com . 2023年3月14日時点のオリジナルよりアーカイブ2026年1月8日閲覧。
  7. ^ “do-while文(GNU C言語マニュアル)”. www.gnu.org . 2024年7月13日時点のオリジナルよりアーカイブ2026年1月8日閲覧。
  8. ^ Thompson, Ken . VCF East 2019 – Brian Kernighan interview Ken Thompson. YouTube . 2021年12月12日時点のオリジナルよりアーカイブ2020年11月16日閲覧。Johnsonのforループのセミコロンバージョンを見て、[B]にそれを入れました。盗用です。
  9. ^ マコーネル、スティーブ(2004年6月9日)『コード・コンプリート』ピアソン・エデュケーション、367ページ。ISBN 978-0-7356-3697-2
  10. ^ Wirth, Niklaus (1973). 「序文」.体系的プログラミング入門. Prentice-Hall. pp. xiii. ISBN 0138803692
  11. ^ “DO / END DO”. www.ibm.com . 2018年4月24日. 2026年1月8日時点のオリジナルよりアーカイブ。 2026年1月8日閲覧
  12. ^ “PERFORM with VARYING Phrase”. www.ibm.com . 2012年6月. 2026年1月8日時点のオリジナルよりアーカイブ。 2026年1月8日閲覧
  13. ^ “Zig ドキュメント”. ziglang.org . 2026年1月4日時点のオリジナルよりアーカイブ2026年1月8日閲覧。
  14. ^ “Looping Through a Collection with for”. rust-lang.org . 2025年12月19日時点のオリジナルよりアーカイブ。 2026年1月8日閲覧
  15. ^ “TIOBE Index for September 2024”. 2026年1月4日時点のオリジナルよりアーカイブ2025年12月16日閲覧。
  16. ^ “for文(GNU C言語マニュアル)”. www.gnu.org . 2024年7月13日時点のオリジナルよりアーカイブ。 2026年1月8日閲覧
  17. ^ "for ステートメント (C++)". learn.microsoft.com . 2025年9月28日時点のオリジナルよりアーカイブ2026年1月8日閲覧。
  18. ^ 「for文(Java™チュートリアル > Java言語の学習 > 言語の基礎)」. docs.oracle.com . 2025年12月28日時点のオリジナルよりアーカイブ。 2026年1月8日閲覧
  19. ^ 「反復ステートメント - for、foreach、do、while - C#リファレンス」。learn.microsoft.com。2025年12月28日時点のオリジナルよりアーカイブ。 2026年1月8日閲覧
  20. ^ “Perl for Loop”. Perlチュートリアル. 2025年6月7日時点のオリジナルよりアーカイブ。 2026年1月8日閲覧
  21. ^ “FORALL”. Intel . 2026年1月1日時点のオリジナルよりアーカイブ2026年1月8日閲覧。
  22. ^ http://www.knosof.co.uk/vulnerabilities/loopcntrl.pdf C言語におけるループ制御変数の分析
「https://en.wikipedia.org/w/index.php?title=ループ(ステートメント)&oldid=1331925403#For_loops」から取得