以下はC標準のスニペットです( n1256 TC3 C99のセクション6.8.5)。
反復ステートメント:
while(式)ステートメント
doステートメントwhile(式);
for(表現opt; 式opt; 式opt)ステートメント
for(宣言式opt; 式opt)ステートメント
私の興味をそそるのは、最後のステートメントfor ( declaration expression ; expression ) statement
です。 6.8.5.1ではfor
ループについて説明していますが、for ( clause-1 ; expression-2 ; expression-3 ) statement
構文についてのみ言及しています。
この構文に従ってコードを記述しようと何度か試みましたが、すべて構文エラーが発生しました。例:
for (int i = 0, i; i++) { /* ... */ }
for (int i = 0; !(i++)) { /* ... */ }
GCC(v4.9.2)を使用してコンパイルすると、すべてerror: expected ‘;’ before ‘)’ token
と同様のエラーが発生します。
標準を正しい方法で解釈しているかどうかはわかりません。この構文を何らかの便利な方法で使用できますか、それとも何かを見落としていましたか?
ご覧のとおり、構文は次のとおりです。
_ for ( declaration expression1opt ; expression2opt ) statement
_
それを一般的なステートメントと比較してみましょう
_ for (int i = 0; i < 10; i++) printf("%d \t", i);
_
ここに、
int i = 0;
_はdeclaration
[_;
_を含む]を示しますi < 10
_は_expression1opt
_を示します[オプション];
_は、_;
_の構文要件に準拠しています[構文で説明されている必要があります]i++
_は_expression2opt
printf("%d \t", i);
はstatement
ですさて、あなたの場合、
_for (int i = 0, i; i++) { /* ... */ }
_
int i = 0, i;
_はdeclaration
を示しますi++
_は_expression1opt
_を示します;
_ is missing...。ここでの最後のポイントはエラーを生成します。構文チェックに合格するには、_;
_が必要です。
残念ながら、これは読みやすいものではありません。 for
ステートメントの2番目のケースを読み間違えています。最初のセミコロンはdeclaration
の不可欠な部分であるため、目には見えません。付録Aを調べることで、このような構文の質問を簡単に確認できます。
(6.7) declaration:
declaration-specifiers init-declarator-listopt ;
static_assert-declaration