Setelah membaca semua jawaban dan beberapa penelitian lagi saya mendapatkan beberapa hal.
Case statements are only 'labels'
Dalam C, sesuai dengan spesifikasi,
§6.8.1 Pernyataan Berlabel:
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
Di C tidak ada klausa yang memungkinkan untuk "deklarasi berlabel". Itu bukan bagian dari bahasa.
Begitu
case 1: int x=10;
printf(" x is %d",x);
break;
Ini tidak akan dikompilasi , lihat http://codepad.org/YiyLQTYw . GCC memberi kesalahan:
label can only be a part of statement and declaration is not a statement
Bahkan
case 1: int x;
x=10;
printf(" x is %d",x);
break;
ini juga bukan kompilasi , lihat http://codepad.org/BXnRD3bu . Di sini saya juga mendapatkan kesalahan yang sama.
Dalam C ++, sesuai dengan spesifikasi,
label-deklarasi diizinkan tetapi label-inisialisasi tidak diizinkan.
Lihat http://codepad.org/ZmQ0IyDG .
Solusi untuk kondisi seperti itu adalah dua
Gunakan ruang lingkup baru menggunakan {}
case 1:
{
int x=10;
printf(" x is %d", x);
}
break;
Atau gunakan pernyataan dummy dengan label
case 1: ;
int x=10;
printf(" x is %d",x);
break;
Deklarasikan variabel sebelum beralih () dan inisialisasi dengan nilai yang berbeda dalam pernyataan kasus jika memenuhi kebutuhan Anda
main()
{
int x; // Declare before
switch(a)
{
case 1: x=10;
break;
case 2: x=20;
break;
}
}
Beberapa hal lagi dengan pernyataan switch
Jangan pernah menulis pernyataan apa pun di sakelar yang bukan merupakan bagian dari label apa pun, karena tidak akan pernah dieksekusi:
switch(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
Lihat http://codepad.org/PA1quYX3 .