Je veux passer du milieu d'une instruction switch
à l'instruction loop 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 valide d'utiliser continue
? Les instructions continue
sont-elles ignorées par les instructions switch
? C et C++ diffèrent-ils ici sur leur comportement?
C'est bien, l'instruction continue
se rapporte à la boucle englobante, et votre code devrait être équivalent à (éviter de telles instructions de saut):
while (something = get_something()) {
if (something == A || something == B)
do_something();
}
Mais si vous vous attendez à ce que break
quitte la boucle, comme le suggère votre commentaire (il essaie toujours à nouveau avec un autre quelque chose, jusqu'à ce qu'il soit faux), vous aurez besoin d'une structure différente.
Par exemple:
do {
something = get_something();
} while (!(something == A || something == B));
do_something();
Oui, c'est OK - c'est comme l'utiliser dans une instruction if
. Bien sûr, vous ne pouvez pas utiliser un break
pour sortir d'une boucle de l'intérieur d'un commutateur.
Oui, continuer sera ignoré par l'instruction switch et ira à l'état de la boucle à tester. Je voudrais partager cet extrait de la référence du langage de programmation C par Ritchie:
L'instruction
continue
est liée àbreak
, mais elle est moins souvent utilisée; elle provoque la prochaine itération de la bouclefor
,while
oudo
englobante. Dans leswhile
etdo
, cela signifie que la partie test est exécutée immédiatement; dans lefor
, le contrôle passe à l'étape d'incrémentation.L'instruction continue ne s'applique qu'aux boucles, pas à une instruction
switch
. Uncontinue
à l'intérieur d'unswitch
à l'intérieur d'une boucle provoque l'itération de boucle suivante.
Je ne suis pas sûr de cela pour C++.
C'est syntaxiquement correct et stylistiquement correct.
Un bon style requiert que chaque instruction case:
Se termine par l'un des éléments suivants:
break;
continue;
return (x);
exit (x);
throw (x);
//fallthrough
De plus, en suivant case (x):
immédiatement avec
case (y):
default:
est autorisé - regroupant plusieurs cas qui ont exactement le même effet.
Tout autre élément est soupçonné d’être une erreur, tout comme if(a=4){...}
Bien sûr, vous avez besoin d’une boucle englobante (while
, for
, do...while
) Pour continue
pour travailler. Il ne rebouclera pas sur 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 valables, tous ces sauts obscurcissent le flux de contrôle - en particulier l'instruction continue
.
J'utiliserais une telle astuce en dernier recours, pas en premier.
Que diriez-vous
while (something = get_something())
{
switch (something)
{
case A:
case B:
do_something();
}
}
Il est plus court et effectue ses tâches de manière plus claire.