while ループ
expression の値がゼロと等しくなるまで、 statement を繰り返し実行します。 テストは繰り返しの各回の前に行われます。
目次 |
[編集]構文
while ( expression) statement | |||||||||
expression | - | スカラー型の任意の式。 この式は繰り返しの各回の前に評価され、それがゼロと等しい場合、ループは終了します。 |
statement | - | 任意の文。 一般的には複文であり、ループの本体として供給します。 |
[編集]説明
while
文は、 expression (制御式とも呼びます) がゼロと等しくなるまで、 statement (ループ本体とも呼びます) を繰り返し実行させます。 繰り返しは普通にループ本体に入ったか goto で statement の途中に入ったかに関わらず行われます。
expression の評価は statement の各回の実行前に行われます (goto で入った場合を除く)。 制御式がループ本体の後に評価される必要がある場合は、 do-while ループを使用することができます。
ループの実行をどこかの点で終了する必要がある場合は、 break 文を終了文として使用することができます。
ループの実行をループ本体の終わりから継続する必要がある場合は、 continue 文をショートカットとして使用することができます。
statement または expressionのいずれの部分にも観察可能な動作 (入出力、 volatile アクセス、アトミック操作または同期操作) がない無限ループを持つプログラムは、未定義動作です。 これは、観察可能でないすべてのループを、それが終了することを証明する必要なく、コンパイラが最適化によって削除することを可能とします。 唯一の例外は、 expression が定数式であるようなループです。 while(true)
は必ず無限ループです。
他のすべての選択文および繰り返し文と同様に、 while 文はブロックスコープを確立します。 expression 内で導入されたあらゆる識別子は、 statement の後、スコープ外になります。 | (C99以上) |
[編集]ノート
しばしばブーリアンおよびポインタの式がループの制御式として使用されます。 ブーリアン値 false
およびあらゆるポインタ型のヌルポインタ値はゼロと等しくなります。
[編集]キーワード
[編集]例
#include <stdio.h>#include <stdlib.h>#include <string.h>enum{ SIZE =8};int main(void){// 平凡な例int array[SIZE], n =0;while(n < SIZE) array[n++]=rand()%2;puts("Array filled!"); n =0;while(n < SIZE)printf("%d ", array[n++]);printf("\n"); // 古典的な strcpy() の実装// (ヌル終端文字列を src から dst にコピーします)char src[]="Hello, world", dst[sizeof src], *p=dst, *q=src;while(*p++=*q++);// 空文puts(dst);}
出力:
Array filled! 1 0 1 1 1 1 0 0 Hello, world