web-dev-qa-db-ger.com

Wie initialisiere ich mehrere Variablen in einer for (;;) - Schleife in C?

Ich dachte, man könnte mehrere Variablen in einer for-Schleife initialisieren:

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

Ich habe gerade herausgefunden, dass dies nicht möglich ist. GCC gibt den folgenden Fehler aus:

fehler: erwartete unqualifizierte-ID vor 'char'

Stimmt es wirklich, dass Sie Variablen verschiedener Typen in einer for-Schleife nicht initialisieren können?

28
bodacydo

Sie können (aber im Allgemeinen nicht) einen lokalen Strukturtyp verwenden.

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

Seit C++ 11 können Sie die einzelnen Teile eleganter initialisieren, sofern sie nicht von einer lokalen Variablen abhängen:

for ( struct { int i = 0; std::string status; } loop;
      loop.status != "done"; ++ loop.i )
    { ... }

Dies ist fast lesbar genug, um es wirklich nutzen zu können.


C++ 17 soll das Problem mit strukturierten Bindungen lösen:

for ( auto [ i, status ] = { 0, ""s }; status != "done"; ++ i )

Das detaillierte Feature-Set und die Syntax sind jedoch noch in Bewegung.

44
Potatoswatter

Es ist wahr, dass Sie Deklaratoren verschiedener Typen nicht gleichzeitig deklarieren und initialisieren können. Dies ist jedoch nicht spezifisch für Schleifen. Sie erhalten eine Fehlermeldung, wenn Sie Folgendes tun:

int i = 0, char *ptr = bam;

auch. Die erste Klausel einer for-Schleife kann (C99 §6.8.5.3) "eine Deklaration" oder ein "void expression" sein. Beachten Sie, dass Sie Folgendes tun können:

int i = 0, *j = NULL;
for(int i = 0, *j = NULL;;){}

weil i und *j beide vom Typ int sind. Die genaue Syntax für eine Deklaration ist in §6.7 angegeben

16

Wenn Sie wirklich brauchen, dass die Variablen im Rahmen der Schleife bleiben, können Sie schreiben

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

Es ist ein bisschen hässlich, funktioniert aber.

12
Axel Gneiting

Versuche dies:

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

Sie können auch tun:

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