Après avoir lu toutes les réponses et quelques recherches supplémentaires, je reçois quelques choses.
Case statements are only 'labels'
En C, selon la spécification,
§6.8.1 Déclarations étiquetées:
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
En C, aucune clause ne permet une "déclaration étiquetée". Cela ne fait tout simplement pas partie de la langue.
Donc
case 1: int x=10;
printf(" x is %d",x);
break;
Cela ne se compilera pas , voir http://codepad.org/YiyLQTYw . GCC donne une erreur:
label can only be a part of statement and declaration is not a statement
Même
case 1: int x;
x=10;
printf(" x is %d",x);
break;
ce n'est pas non plus la compilation , voir http://codepad.org/BXnRD3bu . Ici, je reçois également la même erreur.
En C ++, selon la spécification,
La déclaration étiquetée est autorisée mais l'initialisation étiquetée n'est pas autorisée.
Voir http://codepad.org/ZmQ0IyDG .
La solution à une telle condition est deux
Soit utiliser une nouvelle portée en utilisant {}
case 1:
{
int x=10;
printf(" x is %d", x);
}
break;
Ou utilisez une déclaration fictive avec une étiquette
case 1: ;
int x=10;
printf(" x is %d",x);
break;
Déclarez la variable avant switch () et initialisez-la avec différentes valeurs dans l'instruction case si elle répond à vos besoins
main()
{
int x; // Declare before
switch(a)
{
case 1: x=10;
break;
case 2: x=20;
break;
}
}
Encore plus de choses avec l'instruction switch
N'écrivez jamais dans le commutateur des instructions qui ne font partie d'aucune étiquette, car elles ne seront jamais exécutées:
switch(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
Voir http://codepad.org/PA1quYX3 .