名前空間
変種
操作

for ループ

From cppreference.com
< c‎ | language

ループを実行します。

while ループの短い同等物として使用されます。

目次

[編集] 構文

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全体を含む、ループ本体全体でスコープを持ちます。この宣言で宣言された変数には、autoregister記憶クラス指定子のみが許可されます。
(C99以降)
  • cond-expressionはループ本体の前に評価されます。式の評価結果がゼロの場合、ループステートメントは直ちに終了します。
  • iteration-expressionはループ本体の後に評価され、その結果は破棄されます。iteration-expressionを評価した後、制御はcond-expressionに渡されます。

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

for(;;) {
   printf("endless loop!");
}

loop-statementはオプションではありませんが、ヌルステートメントでも構いません。

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

ループの実行を途中で終了する必要がある場合、loop-statement内のどこでもbreakステートメントを使用できます。

loop-statement内のどこでも使用されるcontinueステートメントは、制御をiteration-expressionに転送します。

cond-expressioniteration-expression、またはloop-statementのいずれかの部分に観測可能な動作(I/O、volatileアクセス、アトミックまたは同期操作)がない無限ループを持つプログラムは、未定義の動作となります。これにより、コンパイラは、終了することを証明せずに、観測不可能なすべてのループを最適化して除去することができます。唯一の例外は、cond-expressionが省略されているか、定数式であるループです。for(;;)は常に無限ループです。

他のすべての選択ステートメントおよび反復ステートメントと同様に、forステートメントはブロックスコープを確立します。init-clausecond-expression、またはiteration-expressionで導入されたすべての識別子は、loop-statementの後でスコープ外になります。

(C99以降)

attr-spec-seqは、forステートメントに適用される属性のオプションリストです。

(C23以降)

[編集] キーワード

for

[編集] 注釈

loop-statementとして使用される式ステートメントは、C++とは異なり、init-clauseのスコープとは異なる、独自のブロックスコープを確立します。

for (int i = 0; ; ) {
    long i = 1;   // valid C, invalid C++
    // ...
}

gotoを使用してループ本体に入ることは可能です。この方法でループに入るとき、init-clausecond-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 ステートメント

[編集] 関連項目

English 日本語 中文(简体) 中文(繁體)