2012-12-20 2 views
2

Il y a quelque chose que je ne comprends pas à propos de la déclaration for, dans le morceau de code suivant s'il vous plaît se concentrer sur le ??? commenter:Doutes sur le fonctionnement de l'instruction 'for'

void user_interface::execute_a_command(const string& cmd, command cmd_table[]) 
{ 
    LOG("user_interface::execute_a_command(): Executing \"",cmd,"\""); 
    bool command_executed = false; 
    //Exist any operation for this command? 
    command* elem = &cmd_table[ 0 ]; //??? 
    for(int i = 0 ; cmd_table[ i ].function != nullptr ; i++, elem = &cmd_table[ i ]) 
    { 
     if(cmd == elem->name) 
     { 
      //Call the function 
      (this->*(elem->function))(); 
      command_executed = true; 
      break; 
     } 
    } 

Eh bien, ce code compile bien et sans avertissements spécifiques. Mais si je mets la déclaration et l'initialisation de « élém » à l'intérieur du « pour » déclaration comme suit:

for(int i = 0 , command* elem = &cmd_table[ 0 ] ; cmd_table[ i ].function != nullptr ; i++, elem = &cmd_table[ i ]) 

g ++ 4.7.2 ne compile pas ce code avec cette erreur:

game.cpp: 834 : 27: erreur: initialiseur attendu avant '' jeton game.cpp: 834: 27: erreur: attendu ';' avant '' jeton

Je ne comprends pas pourquoi. Quelqu'un peut-il m'aider à comprendre le problème ici?

Merci

Répondre

9

Vous ne pouvez pas déclarer des variables de types différents dans le initialiseur. Si elles étaient du même type, il travaillerait:

for (int ii = 0, jj = 1, kk = 2; ii < count; ++ii, --jj, kk += 15) { 
    // ... 

continue plus loin, plusieurs déclarations variables exigent qu'ils soient du même type:

int a, b = 2, *c; // Yes 
float x, double y, std::string z = "no"; // no 
+2

Cela ne s'applique pas seulement aux boucles for- –

+0

@AndreasBrinck: J'ai pensé que cela serait évident à partir de l'exemple, mais je l'ai étendu pour être sûr. – user7116

1

Vous ne pouvez pas faire 2 déclarations de différentes types en utilisant l'opérateur de virgule.

+1

Peut-être juste un nit, mais il n'était pas question d'utiliser la virgule _operator_; La virgule dans ce contexte est la ponctuation, pas un opérateur. –

+0

@JamesKanze bon point, merci – SomeWittyUsername

2

L'initialisation dans l'instruction for peut définir plusieurs variables, mais toutes les variables doivent avoir le même type.

1

Les deux réponses précédentes sont correctes et adresse directement à votre question, mais je vais offrir le style que je préfère, ce qui est de déclarer une « variable de commodité » comme celui-ci directement dans la boucle:

for(int i = 0 ; cmd_table[ i ].function != nullptr ; i++) 
{ 
    command* elem = &cmd_table[ i ]; 
    if(cmd == elem->name) 
    { 
     //Call the function 
     (this->*(elem->function))(); 
     command_executed = true; 
     break; 
    } 
} 

Cette offre un accès "propre" au cmd_table et ne vous laisse pas avec un elem invalide après la fin de la boucle. De plus, il n'y a pas de baisse des performances, car c'est juste un pointeur que le compilateur optimise quand même.