名前空間
変種
操作

do-while ループ

From cppreference.com
< c‎ | language

条件 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 文を使用できます。

無限ループを持つプログラムは、その statementexpression のどの部分にも観測可能な振る舞い (I/O、volatile アクセス、アトミック操作、同期操作) がない場合、未定義の動作となります。これにより、コンパイラはループが終了することを証明することなく、観測不可能なループをすべて最適化で除去できます。唯一の例外は、expression が定数式であるループです。do {...} while(true); は常に無限ループです。

他のすべての選択文や反復文と同様に、do-while 文はブロックスコープを確立します。expression 内で導入された識別子は、文の後にスコープ外になります。

(C99以降)

[編集] ノート

真偽値 (boolean) やポインタの式は、ループの制御式としてよく使われます。真偽値の false と、任意のポインタ型のヌルポインタ値は、ゼロと等しいと評価されます。

[編集] キーワード

do, while

[編集]

#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++ ドキュメント
English 日本語 中文(简体) 中文(繁體)