Utilisation de continuer dans une instruction switch
-
23-09-2019 - |
Question
Je veux sauter à partir du milieu d'une déclaration de switch
, à l'instruction de boucle dans le code suivant:
while (something = get_something())
{
switch (something)
{
case A:
case B:
break;
default:
// get another something and try again
continue;
}
// do something for a handled something
do_something();
}
Est-ce une façon valable d'utiliser continue
? Sont des déclarations continue
ignorées par les déclarations de switch
? Est-ce que C et C ++ diffèrent sur leur comportement ici?
La solution
Il est très bien, la déclaration de continue
se rapporte à la boucle englobante et votre code devrait être équivalent à (éviter de telles déclarations de saut):
while (something = get_something()) {
if (something == A || something == B)
do_something();
}
Mais si vous vous attendez break
pour sortir de la boucle, comme votre commentaire suggère (il essaie toujours de nouveau avec une autre chose, jusqu'à ce qu'il évalue à false), vous aurez besoin d'une structure différente.
Par exemple:
do {
something = get_something();
} while (!(something == A || something == B));
do_something();
Autres conseils
Oui, il est OK - il est tout comme l'utiliser dans une instruction if
. Bien sûr, vous ne pouvez pas utiliser un break
pour sortir d'une boucle à l'intérieur d'un commutateur.
Oui, continuer sera ignorée par l'instruction switch et ira à la condition de la boucle à tester. Je voudrais partager cet extrait de programmation C Référence du langage par Ritchie:
L'instruction
continue
est liée àbreak
, mais moins souvent utilisé; il provoque l'itération suivante de la enfermantfor
,while
ou boucle dedo
commencer. Dans lewhile
etdo
, cela signifie que la partie de test est exécuté immédiatement; dans lefor
, la commande passe à l'étape d'incrémentation.L'instruction continue applique uniquement aux boucles, pas à une déclaration de
switch
. A l'intérieur d'uncontinue
switch
intérieur d'une boucle provoque l'itération suivante de la boucle.
Je ne suis pas sûr que C ++.
Il est syntaxiquement correct et stylistiquement correct.
Un bon style exige que chaque énoncé de case:
doit se terminer par une des opérations suivantes:
break;
continue;
return (x);
exit (x);
throw (x);
//fallthrough
En outre, à la suite case (x):
immédiatement avec
case (y):
default:
est admissible -. L'assemblage de plusieurs cas qui ont exactement le même effet
Tout le reste est soupçonné d'être une erreur, tout comme if(a=4){...}
Bien sûr, vous devez boucle enfermant (while
, for
, do...while
) pour continue
travailler. Il ne sera pas de retour en boucle à case()
seul. Mais une construction comme:
while(record = getNewRecord())
{
switch(record.type)
{
case RECORD_TYPE_...;
...
break;
default: //unknown type
continue; //skip processing this record altogether.
}
//...more processing...
}
... est correct.
Bien que techniquement valides, tous ces sauts flux de contrôle obscur -. En particulier la déclaration de continue
J'utiliser un tel truc en dernier ressort, pas premier.
Qu'en est-
while (something = get_something())
{
switch (something)
{
case A:
case B:
do_something();
}
}
Il est plus court et exécuter ses choses d'une manière plus claire.
Switch est pas considéré comme boucle de sorte que vous ne pouvez pas utiliser Continuer dans une déclaration de cas dans le commutateur ...