do-while loop
条件 式 の値がfalseになるまで、 文 を繰り返し実行します。テストは各反復の後に行われます。
目次 |
構文
attr-spec-seq
(オプション)
do
statement
while (
expression
)
;
|
|||||||||
| attr-spec-seq | - | (C23) オプションの 属性 リスト。ループ文に適用される。 |
| statement | - | 任意の 文 。通常は複合文であり、ループの本体を構成する。 |
| expression | - | 式 で スカラ型 のもの。この式は各反復後に評価され、ゼロと等しい場合にループを終了する。 |
説明
do - while 文は、 statement ( ループ本体 とも呼ばれる)が、 expression ( 制御式 とも呼ばれる)が 0 と等しくなるまで繰り返し実行されることを引き起こします。この繰り返しは、ループ本体が通常に進入された場合でも、 goto によって statement の途中に進入した場合でも関係なく発生します。
expression の評価は、 statement の各実行後(通常に進入した場合も goto によって進入した場合も)に行われます。制御式をループ本体の前に評価する必要がある場合は、 while loop または for loop を使用できます。
ループの実行をある時点で終了する必要がある場合、 break文 を終了文として使用できます。
ループの実行をループ本体の終端で継続する必要がある場合、 continue文 をショートカットとして使用できます。
観測可能な動作(I/O、volatileアクセス、原子操作または同期操作)を一切含まない無限ループを持つプログラムは未定義動作を引き起こします。これにより、コンパイラはループが終了することを証明することなく、すべての観測不可能なループを最適化して除去することが許可されます。唯一の例外は、 expression が定数式であるループです。 do { ... } while ( true ) ; は常に無限ループとなります。
|
他のすべての選択文および反復文と同様に、
|
(C99以降) |
注記
ブール式とポインタ式は、ループ制御式として頻繁に使用されます。ブール値 false およびあらゆるポインタ型のnullポインタ値は、ゼロと等しいと比較されます。
キーワード
例
#include <stdio.h> #include <stdlib.h> enum { SIZE = 8 }; int main(void) { // 単純な例 int array[SIZE], n = 0; do array[n++] = rand() % 2; // ループ本体は単一の式文 while(n < SIZE); puts("Array filled!"); n = 0; do { // ループ本体は複合文 printf("%d ", array[n]); ++n; } while (n < SIZE); printf("\n"); // K&R itoa() のループ。do-while ループは少なくとも1桁が生成されるため使用される int num = 1234, i=0; char s[10]; do s[i++] = num % 10 + '0'; // 逆順で次の桁を取得 while ((num /= 10) > 0); s[i] = '\0'; puts(s); }
出力例:
Array filled! 1 0 1 1 1 1 0 0 4321
参考文献
- C23規格 (ISO/IEC 9899:2024):
-
- 6.8.6.3 do文 (p: 156)
- C17規格 (ISO/IEC 9899:2018):
-
- 6.8.5.2 do文 (p: 109)
- C11規格 (ISO/IEC 9899:2011):
-
- 6.8.5.2 do文 (p: 151)
- C99規格 (ISO/IEC 9899:1999):
-
- 6.8.5.2 do文 (p: 136)
- C89/C90標準 (ISO/IEC 9899:1990):
-
- 3.6.5.2 do文
関連項目
|
C++ documentation
for
do
-
while
loop
|
|
C++ documentation
for
do
-
while
loop
|
タグ内のC++キーワード(do, while)は翻訳せず、元のフォーマットを保持しています。