for ループ
ループを実行します。
while ループの短い同等物として使用されます。
目次 |
[編集] 構文
attr-spec-seq(C23 以降)(オプション) for ( init-clause ; cond-expression ; iteration-expression ) loop-statement |
|||||||||
[編集] 説明
以下のように動作します
- init-clause は式、または宣言(C99 以降)である場合があります。
- 式であるinit-clauseは、cond-expressionの最初の評価の前に一度評価され、その結果は破棄されます。
|
(C99以降) |
- cond-expressionはループ本体の前に評価されます。式の評価結果がゼロの場合、ループステートメントは直ちに終了します。
- iteration-expressionはループ本体の後に評価され、その結果は破棄されます。iteration-expressionを評価した後、制御はcond-expressionに渡されます。
init-clause、cond-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-expression、iteration-expression、またはloop-statementのいずれかの部分に観測可能な動作(I/O、volatileアクセス、アトミックまたは同期操作)がない無限ループを持つプログラムは、未定義の動作となります。これにより、コンパイラは、終了することを証明せずに、観測不可能なすべてのループを最適化して除去することができます。唯一の例外は、cond-expressionが省略されているか、定数式であるループです。for(;;)は常に無限ループです。
|
他のすべての選択ステートメントおよび反復ステートメントと同様に、forステートメントはブロックスコープを確立します。init-clause、cond-expression、またはiteration-expressionで導入されたすべての識別子は、loop-statementの後でスコープ外になります。 |
(C99以降) |
|
attr-spec-seqは、 |
(C23以降) |
[編集] キーワード
[編集] 注釈
loop-statementとして使用される式ステートメントは、C++とは異なり、init-clauseのスコープとは異なる、独自のブロックスコープを確立します。
for (int i = 0; ; ) { long i = 1; // valid C, invalid C++ // ... }
gotoを使用してループ本体に入ることは可能です。この方法でループに入るとき、init-clauseとcond-expressionは実行されません。(その後、制御がループ本体の終わりに達した場合、cond-expressionの実行を含む繰り返しが発生する可能性があります。)
[編集] 例
実行結果の例
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 ループ |