while loop
expression の値がゼロになるまで、 statement を繰り返し実行します。テストは各反復の前に行われます。
目次 |
構文
attr-spec-seq
(オプション)
while (
expression
)
statement
|
|||||||||
| expression | - | 式 のうち、 スカラ型 のもの。この式は各反復の前に評価され、ゼロと等しい場合、ループが終了します。 |
| statement | - | 任意の 文 。通常は複合文であり、ループの本体として機能します。 |
| attr-spec-seq | - | (C23) オプションの 属性 リスト。ループ文に適用されます。 |
説明
while
文は、
statement
(
ループ本体
とも呼ばれる)が、
expression
(
制御式
とも呼ばれる)がゼロと等しくなるまで繰り返し実行されることを引き起こします。この繰り返しは、ループ本体が通常通りに入られた場合でも、
goto
によって
statement
の途中に飛び込んだ場合でも関係なく発生します。
expression の評価は、 statement の各実行前に実施されます(gotoによって入った場合を除く)。制御式をループ本体の後に評価する必要がある場合は、 do-whileループ を使用できます。
ループの実行をある時点で終了する必要がある場合、 break文 を終了文として使用できます。
ループの実行をループ本体の終端で継続する必要がある場合、 continue文 をショートカットとして使用できます。
観測可能な動作(I/O、volatileアクセス、原子操作または同期操作)を一切含まない無限ループを持つプログラムは未定義動作を引き起こします。これにより、コンパイラはループが終了することを証明することなく、すべての観測不可能なループを最適化して除去することが許可されます。唯一の例外は、 expression が定数式であるループです。 while ( true ) は常に無限ループとなります。
|
他のすべての選択文および反復文と同様に、while文は ブロックスコープ を確立します: expression 内で導入された識別子は、 statement の後にスコープから外れます。 |
(C99以降) |
注記
ブール式とポインタ式は、ループ制御式として頻繁に使用されます。ブール値
false
およびあらゆるポインタ型のnullポインタ値は、ゼロと等しいと評価されます。
キーワード
例
#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へnull終端文字列をコピー) 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
参考文献
- C17規格 (ISO/IEC 9899:2018):
-
- 6.8.5.1 while文 (p: 109)
- C11規格 (ISO/IEC 9899:2011):
-
- 6.8.5.1 while文 (p: 151)
- C99規格 (ISO/IEC 9899:1999):
-
- 6.8.5.1 while文 (p: 136)
- C89/C90標準 (ISO/IEC 9899:1990):
-
- 3.6.5.1 while文
関連項目
|
C++ ドキュメント
for
while
ループ
|
`タグ内の"while"は翻訳せず、その後の"loop"のみを「ループ」と翻訳)
HTMLタグ、属性、`
`タグ内のテキストはそのまま保持し、C++固有の用語は翻訳していません。