Po przeczytaniu wszystkich odpowiedzi i kilku dalszych badań otrzymuję kilka rzeczy.
Case statements are only 'labels'
W C, zgodnie ze specyfikacją,
§6.8.1 Stwierdzenia oznaczone:
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
W C nie ma żadnej klauzuli, która dopuszcza „deklarację z etykietą”. To po prostu nie jest częścią języka.
Więc
case 1: int x=10;
printf(" x is %d",x);
break;
To się nie skompiluje , patrz http://codepad.org/YiyLQTYw . GCC podaje błąd:
label can only be a part of statement and declaration is not a statement
Parzysty
case 1: int x;
x=10;
printf(" x is %d",x);
break;
to również nie jest kompilowane , patrz http://codepad.org/BXnRD3bu . Tutaj również pojawia się ten sam błąd.
W C ++, zgodnie ze specyfikacją,
etykieta-deklaracja jest dozwolona, ale etykieta -inicjalizacja nie jest dozwolona.
Zobacz http://codepad.org/ZmQ0IyDG .
Rozwiązaniem takiego stanu są dwa
Użyj nowego zakresu za pomocą {}
case 1:
{
int x=10;
printf(" x is %d", x);
}
break;
Lub użyj fałszywego oświadczenia z etykietą
case 1: ;
int x=10;
printf(" x is %d",x);
break;
Zadeklaruj zmienną przed switch () i zainicjuj ją z różnymi wartościami w instrukcji case, jeśli spełnia twoje wymagania
main()
{
int x; // Declare before
switch(a)
{
case 1: x=10;
break;
case 2: x=20;
break;
}
}
Więcej rzeczy z instrukcją switch
Nigdy nie pisz w przełączniku żadnych instrukcji, które nie są częścią żadnej etykiety, ponieważ nigdy nie zostaną wykonane:
switch(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
Zobacz http://codepad.org/PA1quYX3 .