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;
}
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.
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.)
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
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?";
}
Votre exemple est aussi concis que possible avec la construction switch
.
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.
Vous pouvez utiliser comme ceci:
case 4: case 2:
{
//code ...
}
Pour utiliser un boîtier de commutateur 4 ou 2.
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.)
Non, sauf si vous voulez rompre la compatibilité et votre compilateur le prend en charge.