web-dev-qa-db-fra.com

Comment initialiser plusieurs variables dans une boucle for (;;) en C?

Je pensais que l'on pourrait initialiser plusieurs variables dans une boucle for:

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

Mais je viens de découvrir que ce n'est pas possible. GCC donne l'erreur suivante:

erreur: attendu unqualified-id avant 'char'

Est-il vraiment vrai que vous ne pouvez pas initialiser des variables de types différents dans une boucle for?

28
bodacydo

Vous pouvez (mais généralement pas) utiliser un type de structure local.

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

Depuis C++ 11, vous pouvez initialiser les parties individuelles de manière plus élégante, à condition qu'elles ne dépendent pas d'une variable locale:

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

Ceci est juste assez lisible pour être utilisé.


C++ 17 est prévu pour résoudre le problème avec liaisons structurées :

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

Cependant, le jeu de fonctionnalités détaillé et la syntaxe sont toujours en mutation.

44
Potatoswatter

Il est vrai que vous ne pouvez pas déclarer et initialiser simultanément des déclarants de types différents. Mais ce n'est pas spécifique aux boucles for. Vous obtiendrez une erreur si vous le faites:

int i = 0, char *ptr = bam;

aussi. La première clause d'une boucle for peut être (C99 §6.8.5.3) "une déclaration" ou une "expression vide". Notez que vous pouvez faire:

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

parce que i et *j sont tous deux de type int. La syntaxe exacte pour une déclaration est donnée au § 6.7.

16
Matthew Flaschen

Si vous avez vraiment besoin que les variables restent dans le champ de la boucle, vous pouvez écrire

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

C'est un peu moche, mais ça marche.

12
Axel Gneiting

Essaye ça:

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

Vous pouvez aussi faire:

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