web-dev-qa-db-fra.com

Regrouper les cas de déclaration de commutateur?

Je recherche peut-être quelque chose, mais existe-t-il un moyen simple en C++ de regrouper les cas au lieu de les écrire individuellement? Je me souviens que je pouvais simplement faire:

SELECT CASE Answer
CASE 1, 2, 3, 4

Exemple en C++ (pour ceux qui en ont besoin):

#include <iostream.h>
#include <stdio.h>
int main()
{
   int Answer;
   cout << "How many cars do you have?";
   cin >> Answer;
   switch (Answer)                                      
      {
      case 1:
      case 2:
      case 3:
      case 4:
         cout << "You need more cars. ";
         break;                                        
      case 5:
      case 6:
      case 7:
      case 8:
         cout << "Now you need a house. ";
         break;                                        
      default:
         cout << "What are you? A peace-loving hippie freak? ";
      }
      cout << "\nPress ENTER to continue... " << endl;
      getchar();
      return 0;
}
29
Josh Lake

Non, mais vous pouvez le faire avec un if-else if-else chaîne qui donne le même résultat:

if (answer >= 1 && answer <= 4)
  cout << "You need more cars.";
else if (answer <= 8)
  cout << "Now you need a house.";
else
  cout << "What are you? A peace-loving hippie freak?";

Vous pouvez également gérer le cas de 0 voitures, puis également le cas inattendu d'un nombre négatif de voitures, probablement en lançant une exception.

PS: J'ai renommé Answer en answer car il est considéré comme un mauvais style de démarrer des variables avec une lettre majuscule.

En guise de remarque, les langages de script tels que Python permettent le Nice if answer in [1, 2, 3, 4] la syntaxe qui est un moyen flexible de réaliser ce que vous voulez.

12
marcog

AFAIK tout ce que vous pouvez faire est d'omettre les retours pour rendre les choses plus compactes en C++:

switch(Answer)
{
    case 1: case 2: case 3: case 4:
        cout << "You need more cars.";
        break;
    ...
}

(Vous pouvez également supprimer les autres retours, bien sûr.)

29
Leo Davidson

Sûr que vous pouvez.

Vous pouvez utiliser le cas x ... y pour la plage

Exemple:

#include <iostream.h>
#include <stdio.h>
int main()
{
   int Answer;
   cout << "How many cars do you have?";
   cin >> Answer;
   switch (Answer)                                      
      {
      case 1 ... 4:
         cout << "You need more cars. ";
         break;                                        
      case 5 ... 8:
         cout << "Now you need a house. ";
         break;                                        
      default:
         cout << "What are you? A peace-loving hippie freak? ";
      }
      cout << "\nPress ENTER to continue... " << endl;
      getchar();
      return 0;
}

Assurez-vous que le drapeau "-std = c ++ 0x" est activé dans votre compilateur

17
Ankit Patel

Vous ne pouvez pas supprimer le mot clé case. Mais votre exemple peut être écrit plus court comme ceci:

switch ((Answer - 1) / 4)                                      
{
   case 0:
      cout << "You need more cars.";
      break;                                        
   case 1:
      cout << "Now you need a house.";
      break;                                        
   default:
      cout << "What are you? A peace-loving hippie freak?";
}
5
Dialecticus

Votre exemple est aussi concis que possible avec la construction switch.

3
aschepler

Si vous êtes prêt à suivre le chemin de l'abus du préprocesseur, Boost.Preprocessor peut vous aider.

    #include <boost/preprocessor/seq/for_each.hpp>

    #define CASE_case(ign, ign2, n) case n:

    #define CASES(seq) \
        BOOST_PP_SEQ_FOR_EACH(CASE_case, ~, seq)

    CASES((1)(3)(15)(13))

En exécutant ceci via gcc avec -E -P Pour exécuter uniquement le préprocesseur, l'expansion de CASES donne:

    case 1: case 3: case 15: case 13:

Notez que cela ne passerait probablement pas un examen du code (ne serait pas là où je travaille!), Donc je recommande qu'il soit limité à un usage personnel.

Il devrait également être possible de créer une macro CASE_RANGE(1,5) pour développer

    case 1: case 2: case 3: case 4: case 5:

pour toi aussi.

1
SirGuy

Vous pouvez utiliser comme ceci:

case 4: case 2:
 {
   //code ...
 }

Pour utiliser un boîtier de commutateur 4 ou 2.

1
burakim

gcc a une extension dite "case range":

http://gcc.gnu.org/onlinedocs/gcc-4.2.4/gcc/Case-Ranges.html#Case-Ranges

J'avais l'habitude de l'utiliser lorsque je n'utilisais que gcc. Pas grand-chose à dire à ce sujet - il fait ce que vous voulez, mais uniquement pour les plages de valeurs.

Le plus gros problème avec cela est que seul gcc le supporte; cela peut ou non être un problème pour vous.

(Je soupçonne que pour votre exemple, une instruction if serait un ajustement plus naturel.)

1
please delete me

Non, sauf si vous voulez rompre la compatibilité et votre compilateur le prend en charge.

0
Mitro