Namespaces
Variants

for loop

From cppreference.net

ループを実行します。

whileループ の短縮版として使用されます。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - HTMLタグ、属性、クラス名はすべて保持されています - ` `内のテキストはC++関連の専門用語(Syntax, Explanation, Keywords, Notes, Example, References, See also)であるため、翻訳せずに保持しています - 数字やリンク構造はすべて元のまま維持されています

構文

attr-spec-seq (C23以降) (オプション) for ( init-clause ; cond-expression ; iteration-expression ) loop-statement

説明

以下のように動作します:

  • init-clause は式 または宣言 (C99以降) である可能性があります。
  • init-clause は式であり、最初の cond-expression の評価前に一度だけ評価され、その結果は破棄されます。
  • 宣言である init-clause は、ループ本体全体( init-clause の残りの部分、 cond-expression 全体、 iteration-expression 全体、および loop-statement 全体を含む)でスコープ内にある。この宣言で宣言された変数には、 auto および register ストレージクラス指定子 のみが許可される。
(C99以降)
  • cond-expression はループ本体の前に評価されます。式の結果がゼロの場合、ループ文は直ちに終了します。
  • iteration-expression はループ本体の後に評価され、その結果は破棄されます。 iteration-expression の評価後、制御は cond-expression に移ります。

init-clause cond-expression 、および iteration-expression はすべて省略可能です。 cond-expression が省略された場合、非ゼロの整数定数で置き換えられ、これによりループは無限になります:

for(;;) {
   printf("無限ループ!");
}

loop-statement は省略可能ではありませんが、null文でも構いません:

for(int n = 0; n < 10; ++n, printf("%d\n", n))
    ; // 空文

ループの実行をある時点で終了する必要がある場合、 break statement loop-statement 内の任意の場所で使用できます。

continue文 loop-statement 内のどこで使用されても、制御を iteration-expression に移します。

観測可能な動作(I/O、volatileアクセス、原子操作または同期操作)を一切含まない無限ループは、その cond-expression iteration-expression または loop-statement のいずれの部分においても未定義動作を引き起こします。これにより、コンパイラはループの終了を証明することなく、すべての観測不可能なループを最適化して除去することが可能となります。唯一の例外は、 cond-expression が省略されているか、定数式である場合のループです。 for ( ;; ) は常に無限ループとなります。

他のすべての選択文および反復文と同様に、for文は ブロックスコープ を確立する: init-clause cond-expression 、または iteration-expression で導入された任意の識別子は、 loop-statement の後にスコープ外となる。

(C99以降)

attr-spec-seq はオプションの 属性 リストであり、 for 文に適用されます。

(C23以降)

キーワード

for

注記

loop-statement として使用される式文は、C++とは異なり、 init-clause のスコープとは区別された独自のブロックスコープを確立します:

for (int i = 0; ; ) {
    long i = 1;   // 有効なC、無効なC++
    // ...
}

goto を使用してループ本体に入ることが可能です。この方法でループに入る場合、 init-clause および cond-expression は実行されません。(その後、制御がループ本体の終端に達した場合、 cond-expression の実行を含む繰り返しが発生する可能性があります。)

#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 8 };
int main(void)
{
    int array[SIZE];
    for(size_t i = 0 ; i < SIZE; ++i)
        array [i] = rand() % 2;
    printf("Array filled!\n");
    for (size_t i = 0; i < SIZE; ++i)
        printf("%d ", array[i]);
    putchar('\n');
}

出力例:

Array filled!
1 0 1 1 1 1 0 0

参考文献

  • C17規格 (ISO/IEC 9899:2018):
  • 6.8.5.3 for文 (p: 110)
  • C11規格 (ISO/IEC 9899:2011):
  • 6.8.5.3 for文 (p: 151)
  • C99規格 (ISO/IEC 9899:1999):
  • 6.8.5.3 for文 (p: 136)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 3.6.5.3 for文

関連項目

C++ ドキュメント for for ループ
翻訳内容: - "C++ documentation" → "C++ ドキュメント" - "for loop" → "for ループ"(` `タグ内の"for"は翻訳せず、その後の"loop"のみを翻訳) 注意事項に従い: - HTMLタグ、属性はそのまま保持 - ` `タグ内の"for"はC++キーワードのため翻訳せず - フォーマットと構造は完全に維持 - 専門的な用語は適切に翻訳