do-while ループ
condition の値が false になるまで statement を繰り返し実行します。 テストは繰り返しの各回の後に行われます。
構文
do statement while ( expression ) ;
|
|||||||||
| expression | - | スカラー型の任意の式。 この式は繰り返しの各回の後に評価され、ゼロと等しい場合、ループを終了します。 |
| statement | - | 任意の文。 一般的には複文であり、ループの本体です。 |
説明
do-while 文は、 expression (制御式とも呼びます) が 0 と等しくなるまで、 statement (ループ本体とも呼びます) を繰り返し実行させます。 繰り返しは普通にループ本体に入ったか goto で statement の途中に入ったかに関わらず行われます。
expression の評価は statement の各回の実行後に行われます (普通に入ったか goto で入ったかに関わらず)。 制御式がループ本体の前に評価される必要がある場合は、 while ループ や for ループが使用できます。
ループの実行をどこかの点で終了する必要がある場合は、 break 文を終了文として使用することができます。
ループの実行をループ本体の終わりから継続する必要がある場合は、 continue 文をショートカットとして使用することができます。
statement または expressionのいずれの部分にも観察可能な動作 (入出力、 volatile アクセス、アトミック操作または同期操作) がない無限ループを持つプログラムは、未定義動作です。 これは、観察可能でないすべてのループを、それが終了することを証明する必要なく、コンパイラが最適化によって削除することを可能とします。 唯一の例外は、 expression が定数式であるようなループです。 do {...} while(true); は必ず無限ループです。
|
他のすべての選択文および繰り返し文と同様に、 do-while 文はブロックスコープを確立します。 expression 内で導入されたあらゆる識別子は、 statement の後、スコープ外になります。 |
(C99以上) |
ノート
しばしばブーリアンおよびポインタの式がループの制御式として使用されます。 ブーリアン値 false およびあらゆるポインタ型のヌルポインタ値はゼロと等しくなります。
キーワード
例
#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() より。
// 少なくとも1桁は必ず出力するため、 do-while ループが使用されます。
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
参考文献
- C11 standard (ISO/IEC 9899:2011):
- 6.8.5.2 The do statement (p: 151)
- C99 standard (ISO/IEC 9899:1999):
- 6.8.5.2 The do statement (p: 136)
- C89/C90 standard (ISO/IEC 9899:1990):
- 3.6.5.2 The do statement
関連項目
do-while ループ の C++リファレンス
|