Depois de ler todas as respostas e mais algumas pesquisas, recebo algumas coisas.
Case statements are only 'labels'
Em C, de acordo com a especificação,
§6.8.1 Declarações rotuladas:
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
Em C, não há nenhuma cláusula que permita uma "declaração rotulada". Simplesmente não faz parte do idioma.
assim
case 1: int x=10;
printf(" x is %d",x);
break;
Isso não será compilado , consulte http://codepad.org/YiyLQTYw . O GCC está dando um erro:
label can only be a part of statement and declaration is not a statement
Até
case 1: int x;
x=10;
printf(" x is %d",x);
break;
isso também não está sendo compilado , consulte http://codepad.org/BXnRD3bu . Aqui também estou recebendo o mesmo erro.
Em C ++, de acordo com a especificação,
A declaração etiquetada é permitida, mas a inicialização rotulada não é permitida.
Veja http://codepad.org/ZmQ0IyDG .
A solução para essa condição é dois
Use o novo escopo usando {}
case 1:
{
int x=10;
printf(" x is %d", x);
}
break;
Ou use uma declaração fictícia com etiqueta
case 1: ;
int x=10;
printf(" x is %d",x);
break;
Declare a variável antes de switch () e inicialize-a com valores diferentes na instrução case, se ela atender aos seus requisitos
main()
{
int x; // Declare before
switch(a)
{
case 1: x=10;
break;
case 2: x=20;
break;
}
}
Mais algumas coisas com a instrução switch
Nunca escreva nenhuma declaração no comutador que não faça parte de nenhum rótulo, porque elas nunca serão executadas:
switch(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
Veja http://codepad.org/PA1quYX3 .