for
ループでいくつかの変数を初期化できると思いました:
for (int i = 0, char* ptr = bam; i < 10; i++) { ... }
しかし、これは不可能であることがわかりました。 GCCは次のエラーを出します:
エラー: 'char'の前にunqualified-idが必要です
for
ループで異なるタイプの変数を初期化できないのは本当ですか?
ローカルの構造体型を使用できます(ただし、通常は使用しないでください)。
for ( struct { int i; char* ptr; } loopy = { 0, bam };
loopy.i < 10 && * loopy.ptr != 0;
++ loopy.i, ++ loopy.ptr )
{ ... }
C++ 11以降、ローカル変数に依存しない限り、個々のパーツをよりエレガントに初期化できます。
for ( struct { int i = 0; std::string status; } loop;
loop.status != "done"; ++ loop.i )
{ ... }
これは実際に使用するのに十分なほど読みやすくなっています。
C++ 17は構造化バインディングの問題に対処する予定です。
for ( auto [ i, status ] = { 0, ""s }; status != "done"; ++ i )
ただし、詳細な機能セットと構文はまだ流動的です。
異なる型の宣言子を同時に宣言して初期化することはできないのは事実です。ただし、これはforループに固有のものではありません。次の場合、エラーが発生します。
int i = 0, char *ptr = bam;
あまりにも。 forループの最初の句は(C99§6.8.5.3)「宣言」または「void式」のいずれかです。あなたができることに注意してください:
int i = 0, *j = NULL;
for(int i = 0, *j = NULL;;){}
i
と*j
は両方ともint
タイプです。宣言の正確な構文は、§6.7に記載されています。
ループのスコープ内にとどまる変数が本当に必要な場合は、次のように書くことができます
{ char* ptr = bam; for (int i = 0; i < 10; i++) { ... } }
少し見苦しいですが、動作します。
これを試して:
int i;
char* ptr;
for (i = 0, ptr = bam; i < 10; i++) { ... }
あなたも行うことができます:
for (int i = 0; i < 10; i++) {
static char* ptr = bam;
}