2010-01-27 6 views
56

Je veux sauter à partir du milieu d'une déclaration switch, à l'instruction de boucle dans le code suivant:dans une Utilisation continue instruction switch

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 un moyen valable d'utiliser continue? Les instructions continue sont-elles ignorées par les instructions switch? Est-ce que C et C++ diffèrent sur leur comportement ici?

+0

Votre idée est bien, mais la boucle ci-dessus n'exécutera jamais 'do_something()'. – antik

+4

Même si le contrôle atteint le cas A ou le cas B? –

+13

J'allais dire, antik est faux à propos de ça Dans le cas de A ou B alors do_something() va s'exécuter. Avec – acron

Répondre

42

Il est très bien, la déclaration 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érer (il essaie toujours encore avec un autre quelque chose, jusqu'à ce qu'il évalue à faux), vous aurez besoin d'une structure différente.

Par exemple:

do { 
    something = get_something(); 
} while (!(something == A || something == B)); 
do_something(); 
+1

'équivalent' seulement dans le sens sémantique. le code généré par le compilateur est très différent. avec une instruction switch, le compilateur peut générer une table de saut qui évite les comparaisons multiples et est ainsi beaucoup plus rapide que la comparaison avec chaque élément 1 par 1. – chacham15

+0

+1 pour "l'instruction continue se rapporte à la boucle englobante" – onmyway133

+0

@ chacham15, pourquoi couldn ' t le compilateur génère le même code pour les deux? – avakar

18

Oui, c'est OK - c'est comme si vous l'utilisiez 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.

+0

Mais 'if' n'a aucun effet sur le comportement de' continue' ou 'break'. Comment voulez-vous dire que c'est semblable? –

+0

@Matt Je veux dire qu'il va continuer la boucle dans les deux cas. –

+1

@Neil, d'accord, la confusion évitée. –

4

Bien que techniquement valides, tous ces sauts de flux de contrôle obscur - en particulier la déclaration continue.

Je voudrais utiliser une telle astuce en dernier recours, pas le premier.

Que diriez-vous

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.

+1

désolé pour la confusion Alexander, le code est pour la démonstration seulement, j'ai une bonne raison (je crois) pour la structure réelle dans mon code. –

+2

@Matt: Cela signifierait probablement une structure encore plus obfusquée ... :) – visitor

+0

@visitor, oui c'est –

5

C'est syntaxiquement correct et stylistiquement correct.

Un bon style exige que chaque déclaration case: doit se terminer par une des opérations suivantes:

break; 
continue; 
return (x); 
exit (x); 
throw (x); 
//fallthrough 

De plus, à la suite case (x): immédiatement avec

case (y): 
default: 

est admissible - 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) pour continue travailler. Il ne reviendra pas à 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... 
} 

... c'est correct.

+2

désolé pour necroposting, mais j'ajouterais qu'un appel à 'exit' serait aussi généralement une bonne chose à la fin un boîtier de commutateur avec. – Vality

2

Oui, continuer sera ignoré par l'instruction switch et passera à l'état de la boucle à tester. Je voudrais partager cet extrait de la référence C Programming Language par Ritchie "L'instruction continue est liée à break, mais moins souvent utilisée, elle provoque le début de l'itération suivante de la boucle for, while ou do.Dans le temps et le faire, cela signifie que la partie test est exécutée immédiatement; dans le cas de, le contrôle passe à l'étape d'incrément. L'instruction continue s'applique uniquement aux boucles, ne pas basculer. Une continuation à l'intérieur d'un commutateur à l'intérieur d'une boucle provoque l'itération de la boucle suivante. "

Je ne suis pas sûr que C++.

-1

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 ...

+0

L'instruction 'switch' est dans une boucle while, donc' continue' est parfaitement valide. – Rick

Questions connexes