do-while ループ
条件 expression の値が false になるまで statement を繰り返し実行します。判定は各反復の後に行われます。
目次 |
[編集] 構文
attr-spec-seq(optional) do statement while ( expression ) ; |
|||||||||
| 式 | - | 任意のスカラ型の式。この式は各反復の後に評価され、もしゼロと等しいと評価された場合、ループは終了します。 |
| statement | - | 任意の文。通常はループの本体となる複合文です。 |
| attr-spec-seq | - | (C23)ループ文に適用される、属性の任意のリスト。 |
[編集] 解説
do-while 文は、expression (「制御式」とも呼ばれる) が0と等しいと評価されるまで、statement (「ループ本体」とも呼ばれる) を繰り返し実行させます。この繰り返しは、ループ本体が通常の方法で開始されたか、statement の途中に goto でジャンプしてきたかに関わらず発生します。
expression の評価は、各 statement の実行後に行われます (通常の方法で開始されたか、gotoでジャンプしてきたかに関わらず)。もし制御式をループ本体の前に評価する必要がある場合は、while ループや for ループが使用できます。
ある時点でループの実行を終了させる必要がある場合、終了文として break 文を使用できます。
ループ本体の末尾でループの実行を継続する必要がある場合、ショートカットとして continue 文を使用できます。
無限ループを持つプログラムは、その statement や expression のどの部分にも観測可能な振る舞い (I/O、volatile アクセス、アトミック操作、同期操作) がない場合、未定義の動作となります。これにより、コンパイラはループが終了することを証明することなく、観測不可能なループをすべて最適化で除去できます。唯一の例外は、expression が定数式であるループです。do {...} while(true); は常に無限ループです。
|
他のすべての選択文や反復文と同様に、do-while 文はブロックスコープを確立します。expression 内で導入された識別子は、文の後にスコープ外になります。 |
(C99以降) |
[編集] ノート
真偽値 (boolean) やポインタの式は、ループの制御式としてよく使われます。真偽値の false と、任意のポインタ型のヌルポインタ値は、ゼロと等しいと評価されます。
[編集] キーワード
[編集] 例
#include <stdio.h> #include <stdlib.h> enum { SIZE = 8 }; int main(void) { // trivial example int array[SIZE], n = 0; do array[n++] = rand() % 2; // the loop body is a single expression statement while(n < SIZE); puts("Array filled!"); n = 0; do { // the loop body is a compound statement printf("%d ", array[n]); ++n; } while (n < SIZE); printf("\n"); // the loop from K&R itoa(). The do-while loop is used // because there is always at least one digit to generate int num = 1234, i=0; char s[10]; do s[i++] = num % 10 + '0'; // get next digit in reverse order while ((num /= 10) > 0); s[i] = '\0'; puts(s); }
実行結果の例
Array filled! 1 0 1 1 1 1 0 0 4321
[編集] 参照
- C17標準 (ISO/IEC 9899:2018)
- 6.8.5.2 The do statement (p: 109)
- C11標準 (ISO/IEC 9899:2011)
- 6.8.5.2 The do statement (p: 151)
- C99標準 (ISO/IEC 9899:1999)
- 6.8.5.2 The do statement (p: 136)
- C89/C90標準 (ISO/IEC 9899:1990)
- 3.6.5.2 The do statement
[編集] 関連項目
do-while ループのC++ ドキュメント |