2017-08-28 2 views
-4

Essentiellement, mon boîtier de commutation ne fonctionne pas correctement car les instructions pour les conditions que je ne pense pas être remplies s'exécutent de toute façon.Commutateur "ne semble pas fonctionner" C++

entrée Exemple:

CerseiTyrion 

Sortie prévue:

Cersei 
Tyrion 

sortie actuelle:

Cersei 
Tyrion 
Jon 
Dany 
Tyrion 
Jon 
Dany 

L'objectif de la fonction suivante est d'analyser un texte d'entrée pour un jeu d'aventure et laissez le jeu connaître certaines des informations importantes contenues dans le texte. Il continue ensuite à utiliser ce qu'il trouve pour exécuter du code qui devrait toujours fonctionner avec le reste de la fonction si certaines conditions sont remplies.

Minimal, complet; exemple vérifiable:

void HandleGameState(const std::string& text) { 

    enum Characters { 
     Cersei = 0x01, 
     Tyrion = 0x02, 
     Jon = 0x04, 
     Dany = 0x08 
    }; 

    unsigned int mask = 1; 

    switch(characterMask & mask) 
    { 
     case Cersei: 
     { 
     std::cout << "Cersei" << std::endl; 
     }; 
     case Tyrion: 
     { 
     std::cout << "Tyrion" << std::endl; 
     }; 
     case Jon: 
     { 
     std::cout << "Jon" << std::endl; 
     }; 
     case Dany: 
     { 
     std::cout << "Dany" << std::endl; 
     }; 
    } 
} 
+2

Mettez simplement 'break' après la fin de chaque instruction de requête. – zindarod

+0

Nous avons généralement une «pause» après chaque cas pour ne pas tomber au suivant. –

+2

Prenez un 'break;' de GoT s'il vous plaît :) – ABcDexter

Répondre

5

Vous devez terminer votre cas de commutation avec break déclarations, le code autrement continue à l'étiquette suivante de cas.

Contre-intuitif pour certaines personnes, switch n'est pas glorifié instruction multi-if, mais plutôt une instruction glorifiée goto. Chaque étiquette de cas se comporte comme goto étiquette, et absent de break, le code continuera simplement à s'exécuter.

Ceci est souvent utilisé dans les cas où deux étiquettes de cas différentes doivent produire la même sortie - au lieu de dupliquer le code, les étiquettes sont simplement placées les unes après les autres. Par exemple:

switch (x) { 
    case 1: // fall through 
    case 2: work_one_or_two(); break; 
    ... 
} 
+0

Bonne réponse pour expliquer la nature _label_ de 'case' (une question triviale malheureusement). – user0042

+0

Merci pour la réponse! :) –

2

Vous devez utiliser break derrière chaque case.

La règle de commutation/cas est facile, après un cas mached, tous les cas suivants seront exécutés jusqu'à une pause; ou fin de l'interrupteur.