Je veux passer du milieu d'une switch
instruction à 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 manière valable d'utiliser continue
? Les continue
déclarations sont-elles ignorées par les switch
déclarations? C et C ++ diffèrent-ils sur leur comportement ici?
do_something()
.goto
.Réponses:
C'est bien, l'
continue
instruction se rapporte à la boucle englobante, et votre code devrait être équivalent à (en évitant de telles instructions de saut):while (something = get_something()) { if (something == A || something == B) do_something(); }
Mais si vous prévoyez
break
de quitter la boucle, comme votre commentaire le suggère (il essaie toujours à nouveau avec un autre élément, jusqu'à ce qu'il soit évalué à faux), vous aurez besoin d'une structure différente.Par exemple:
do { something = get_something(); } while (!(something == A || something == B)); do_something();
la source
Oui, c'est OK - c'est comme l'utiliser dans une
if
déclaration. Bien sûr, vous ne pouvez pas utiliser abreak
pour sortir d'une boucle depuis l'intérieur d'un commutateur.la source
if
n'a aucun effet sur le comportement decontinue
oubreak
. Comment voulez-vous dire que c'est pareil?Oui, continue sera ignoré par l'instruction switch et passera à la condition de la boucle à tester. J'aimerais partager cet extrait de la référence The C Programming Language par Ritchie:
Je ne suis pas sûr de cela pour C ++.
la source
C'est syntaxiquement correct et stylistiquement correct.
Un bon style exige que chaque
case:
déclaration se termine par l'un des éléments suivants:break; continue; return (x); exit (x); throw (x); //fallthrough
De plus, suivre
case (x):
immédiatement aveccase (y): default:
est autorisé - regrouper 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
) pourcontinue
travailler. Il ne reviendra pascase()
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.
la source
exit
serait également généralement une bonne chose pour terminer un cas de commutation.default:
n'est pas nécessaire que ce soit la dernière / dernière entrée - comme le souligne cette question ...default:
cas le premier au lieu du dernier. Comme "faites ceci, sauf si vous obtenez les valeurs inhabituelles suivantes, qui doivent être traitées comme suit".Bien que techniquement valides, tous ces sauts obscurcissent le flux de contrôle - en particulier la
continue
déclaration.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.
la source
Cela peut être un mégabit trop tard, mais vous pouvez utiliser
continue 2
.Certains builds / configs PHP afficheront cet avertissement:
Par exemple:
$i = 1; while ($i <= 10) { $mod = $i % 4; echo "\r\n out $i"; $i++; switch($mod) { case 0: break; case 2: continue; break; default: continue 2; break; } echo " is even"; }
Cela produira:
out 1 out 2 is even out 3 out 4 is even out 5 out 6 is even out 7 out 8 is even out 9 out 10 is even
Testé avec PHP 5.5 et supérieur.
la source
Switch n'est pas considéré comme une boucle, vous ne pouvez donc pas utiliser Continue dans une instruction case dans switch ...
la source
switch
instruction est à l'intérieur d'unewhile
boucle, ellecontinue
est donc parfaitement valide.