Dopo aver letto tutte le risposte e qualche altra ricerca, ottengo alcune cose.
Case statements are only 'labels'
In C, secondo le specifiche,
§6.8.1 Dichiarazioni etichettate:
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
In C non esiste alcuna clausola che consenta una "dichiarazione etichettata". Non fa parte della lingua.
Così
case 1: int x=10;
printf(" x is %d",x);
break;
Questo non verrà compilato , vedere http://codepad.org/YiyLQTYw . GCC sta dando un errore:
label can only be a part of statement and declaration is not a statement
Anche
case 1: int x;
x=10;
printf(" x is %d",x);
break;
anche questo non è compilando , vedi http://codepad.org/BXnRD3bu . Anche qui sto ottenendo lo stesso errore.
In C ++, secondo le specifiche,
è consentita la dichiarazione con etichetta, ma non è consentita l'inizializzazione con etichetta.
Vedi http://codepad.org/ZmQ0IyDG .
La soluzione a tale condizione è due
Utilizza il nuovo ambito usando {}
case 1:
{
int x=10;
printf(" x is %d", x);
}
break;
O utilizzare la dichiarazione fittizia con etichetta
case 1: ;
int x=10;
printf(" x is %d",x);
break;
Dichiarare la variabile prima di switch () e inizializzarla con valori diversi nell'istruzione case se soddisfa i requisiti
main()
{
int x; // Declare before
switch(a)
{
case 1: x=10;
break;
case 2: x=20;
break;
}
}
Altre cose con l'istruzione switch
Non scrivere mai istruzioni nello switch che non fanno parte di alcuna etichetta, perché non verranno mai eseguite:
switch(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
Vedi http://codepad.org/PA1quYX3 .