2 votes

switch : rupture sans casse

J'ai les éléments suivants switch avec un break sans un case :

char c = 'a';
switch(c) {
    break;
    case 'a' : cout << 'a' << endl;
    break;
    case 'b' : cout << 'b' << endl;
    break;
    default : break;
}

Pourquoi ce bout de code imprime-t-il a ? L'interrupteur ne devrait-il pas se casser après avoir rencontré la première break déclaration uniquement ?

4voto

YSC Points 3386

Le premier break est ignorée.

Sur switch(c) le runtime saute à case 'a' como c=='a' . Tout ce qui précède est ignoré.

C'est pourquoi case 'b' fonctionne sans impression 'a' et c'est la raison pour laquelle les définitions de variables sont désapprouvées en switch blocs :

int n=0;
switch (n)
{
    int k=n;
case 0:
    return k; // UB
}

1voto

Rusi Points 696

En C, un case à l'intérieur d'un switch est (analogue à) une étiquette goto. La tête de l'étiquette switch est analogue à la goto lui-même.

Conséquences

  • break doit en général être utilisé parce que le "switch-in" est basé sur le goto, c'est-à-dire qu'il n'est pas structuré ou qu'il n'y a qu'un seul point d'entrée et de sortie.
  • Toute déclaration avant la première case n'est jamais atteint
  • Usage célèbre Dispositif Duffs

1voto

tevemadar Points 5069

A switch est une forme compacte et lisible de ce qui pourrait être une série d'horribles if et goto s autrement :

char c = 'a';
if(c=='a')goto _a;         // test for "case 'a':"
if(c=='b')goto _b;         // test for "case 'b':"
goto _default;             // unconditional jump to "default:"
goto _break;               // <-- program never goes to this line, the one you are asking about
_a: cout << 'a' << endl;
goto _break;
_b: cout << 'b' << endl;
goto _break;
_default:
goto _break;
_break:

Test : https://ideone.com/OgsQuT

0voto

tobi303 Points 2932

De Référence cpp :

Si la condition donne une valeur égale à la valeur de l'une des expressions_constantes, le contrôle est transféré à l'instruction étiquetée avec cette expression_constante.

Si la condition est évaluée à une valeur qui ne correspond à aucune des étiquettes case : et que l'étiquette default : est présente, le contrôle est transféré à l'instruction étiquetée avec l'étiquette default :.

Le site switch fonctionne comme s'il y avait un goto de la condition à la case d'où votre break n'est jamais exécuté. Plus généralement, tout ce que vous mettez là est du code mort :

switch(1) {
    foo();                // dead code !
    case 1 : cout << '1'; // prints "1"
         break;       // and exits the switch
    case 2 : cout << '2';
         break;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X