web-dev-qa-db-ja.com

Cのfor(;;)ループでいくつかの変数を初期化するにはどうすればよいですか?

forループでいくつかの変数を初期化できると思いました:

for (int i = 0, char* ptr = bam; i < 10; i++) { ... }

しかし、これは不可能であることがわかりました。 GCCは次のエラーを出します:

エラー: 'char'の前にunqualified-idが必要です

forループで異なるタイプの変数を初期化できないのは本当ですか?

31
bodacydo

ローカルの構造体型を使用できます(ただし、通常は使用しないでください)。

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 )

ただし、詳細な機能セットと構文はまだ流動的です。

45
Potatoswatter

異なる型の宣言子を同時に宣言して初期化することはできないのは事実です。ただし、これは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に記載されています。

18

ループのスコープ内にとどまる変数が本当に必要な場合は、次のように書くことができます

{ char* ptr = bam; for (int i = 0; i < 10; i++) { ... } }

少し見苦しいですが、動作します。

13
Axel Gneiting

これを試して:

int i;
char* ptr;
for (i = 0, ptr = bam; i < 10; i++) { ... }
7
Gary

あなたも行うことができます:

for (int i = 0; i < 10; i++) {
    static char* ptr = bam;
}
0
Ladon