while文 (: while statement) はプログラミング言語において繰り返し(ループ)の制御構造を記述するための (statement) である。英語の接続詞 while の意味「〜である間」の通り、継続条件として指定された(制御式)を評価した値が真である間、ループ本体 (loop body) [1]の処理を繰り返し実行する。

while文では通例、ループの最初に継続条件式を評価する。したがって、継続条件式が偽であった場合はループ本体の処理は一度も実行されない。プログラミング言語によっては、ループの本体を一度実行した後、継続条件式を評価するdo-while文をサポートするものもある。do-while文では継続条件式の真偽にかかわらず、ループ本体の処理が必ず一度は実行される。詳細は当該記事も参照のこと。

なお、関数型言語では通例、whileループは文ではなく式 (expression) として定義される。while式はwhile文よりもプログラム中で記述できる位置に関して柔軟性がある。Haskellのような純粋関数型言語では、ループは常に再帰末尾再帰)を使って記述するため、whileループの構文をサポートしないものもある。

編集

Cおよびそれに類する言語

編集

C言語, C++, C#, D, Java, Perlなどでは以下のような構文である。

while (条件)
     // ここの部分を「ループ本体」と呼ぶ

このループの実行は、次のような手順となる。

  1. 「条件」を評価する。「条件」がならば、ループを終了する。
  2. 「文」を実行する。
  3. 「条件」の評価に戻る。

「条件」がはじめから偽の場合は、「文」は一度も実行されない。

ループ本体が複数の文からなる場合、ブロック(複文)を使う。

while (条件) {
    ...
}

プログラム例

編集
int x = 0;
while (x < 100) {
    printf("x は %d です。\n", x);
    ++x; // x の値を 1 だけ増やす(インクリメントする)。
}

これを実行すると、次のように標準出力に出力する。

x は 0 です。
x は 1 です。

…………
 
x は 98 です。
x は 99 です。

変数xの初期値は0であり、ループ本体の処理を1回実行するたびにインクリメントされる。xの値が100未満すなわち99のときまではループ本体の処理が実行され、最終的にxの値が100になる。その後、継続条件式を評価するとき、条件は成り立たなくなり、ループは終了する。

ループの脱出と継続

編集

ループの脱出と継続の制御に利用できる分岐文を備える言語もある。break文は、ループ本体の複文の途中からであっても、またwhileの条件が成り立っていても、ループ中から抜け出す。continue文はループの途中から、ループ本体の最後に飛び[2]、while文の場合にはそこから先頭に戻って条件の評価となる。

goto文を使える言語では、whileループの脱出にgoto文を使うこともできる。通常はbreak文のほうが好ましいが、多重ループを脱出する場合やswitch文をループ本体に含む場合などでは、goto文のほうが簡潔に記述できる。return文や例外のスローによってループを脱出することのできる言語もある。

Pascal

編集

Pascalにおけるwhile文は、C言語系列と概ね同様であり、キーワードとして whiledo を使う。一方、do-while文に関しては、repeat-until文が相当するが、キーワードとして repeatuntil を使う点が異なるだけでなく、制御式として継続条件ではなく終了条件(真のときループを終了)を記述する点も異なる。

構文

編集
while 条件 do 
repeat ; ...;  until 条件

LL(1)の単純な構文というPascalのポリシーから、両者で全く違うキーワードを使う設計(デザイン)となっている。

whileでは複数の文を置く場合には begin-end で複文にしなければならないが、repeat-until はそれ自身が暗黙のブロック構文になっているので、セミコロンで区切って複数の文を置くことができる。

Basic

編集

Full BASIC(INCITS/ISO/IEC 10279-1991 (R2005) "Information Technology – Programming Languages – Full BASIC")には、ループの多くのパターンに対応する柔軟性のあるDo-Loop文がある。またVisual Basicには、それに加えて伝統的なBASICのWHILEに近いWhile文もある。

構文

編集

Visual Basic .NETにおけるWhile文は以下のような構文である[3]Visual Basicでは While...Wend だが、VB.NETでは While...End While となっている。

While 条件
    ...
    [ (Continue|Exit) While ]
    ...
End While

Exit While はbreak文、Continue While はcontinue文に相当する機能を持つ。

Do...Loop文は以下のような構文である[4]

Do [(While|Until) 条件]
    ...
    [ (Continue|Exit) Do ]
    ...
Loop [(While|Until) 条件]

Do の後に While を続ければ、while文に相当し、Loop の後に Until を続ければ、Pascalの repeat-until に相当する。どちらにも条件を付けなければ、単純な無限ループになる。

編集
  1. ^ JIS X 3010:2003「プログラム言語C」§6.8.5「繰返し文」
  2. ^ JIS X 3010:2003「プログラム言語C」§6.8.6.2「continue文」
  3. ^ While...End While Statement (Visual Basic) | Microsoft Docs
  4. ^ Do...Loop Statement (Visual Basic) | Microsoft Docs

関連項目

編集

📚 Artikel Terkait di Wikipedia

ループ (プログラミング)

loop) とは、コンピュータプログラムにおける制御構造の一つであり、特定の条件が成立している間、同じ処理を繰り返し実行する構文である。反復処理を簡潔かつ明示的に記述するために用いられ、多くのプログラミング言語で標準的に実装される。代表的な形式にはwhileループ、forループ、do‑whileループなどがある。

制御構造

組み合わせて、同様のプログラムを書ける。 while (true) { xxx1 if (not test) break xxx2 } Adaでは、上記のループ構造(loop-while-repeat)の代替として標準の無限ループ(loop-end loop)内で exit when節を使うことで同様の制御構造を実現できる(後述の

木構造 (データ構造)

Do While hasLeftChild(n) Let node ← node.left Loop Do visit(n) If hasRightChild(n) Then Let n ← n.right Do While hasLeftChild(n) Let n ← n.left Loop Else

ストアドプロシージャ

ための宣言された変数や、テーブルの複数の行をループするためのカーソルを含むこともできる。ストアドプロシージャのフロー制御文には、通常、IF、WHILE、LOOP、REPEAT、CASE文などがある。ストアドプロシージャは、変数の宣言方法と宣言場所によって、変数を受け取って結果を返したり、変数を変更して結果を返したりすることができる。

無限ループ

無限ループ(むげんループ、英: infinite loop)は、コンピュータプログラムにおいて終了条件が成立しないため処理が反復実行され続けて停止しない実行形態である。永久ループ(えいきゅうループ)とも呼ばれる。 無限ループは常時動作する処理を目的として意図的に利用される場合がある一方、設計や実装の

Do-while文

do-while文 (英: do-while statement) は、C言語および類似のプログラミング言語において繰り返し(ループ)の制御構造を記述するための文 (statement) のひとつである。C言語の規格では「do文」と呼ばれる。ループ本体 (loop body)

QuickBASIC

(多次元)配列 構造体 グローバル変数とローカル変数、スタティック変数とC言語で言うauto変数があった。 for while ... wend do ... loop 最後の do ... loop がもっとも柔軟に書ける形式である。 一行if if 条件 then 真のとき else 偽のとき 複数行if

マージソート

== mid) { /* i側のAをBに移動し尽くしたので、j側も順番にBに入れていく */ while (j < right) { B[k++] = A[j++]; } } else { while (i < mid) { /* j側のAをBに移動し尽くしたので、i側も順番にBに入れていく */