Apa gunanya menggunakan {
dan }
dalam sebuah case
pernyataan? Biasanya, tidak peduli berapa banyak baris yang ada dalam sebuah case
pernyataan, semua baris akan dieksekusi. Apakah ini hanya aturan mengenai kompiler lama / baru atau ada sesuatu di balik itu?
int a = 0;
switch (a) {
case 0:{
std::cout << "line1\n";
std::cout << "line2\n";
break;
}
}
dan
int a = 0;
switch (a) {
case 0:
std::cout << "line1\n";
std::cout << "line2\n";
break;
}
c++
switch-statement
mahmood
sumber
sumber
switch
kata kunci, dan dalam contoh kedua, pernyataan terlampir hanya menjorok sekali. Perhatikan bagaimana Anda memiliki empat spasi de-indent setelahbreak;
.statement
. Di C ++, Anda bisa (salah satu komponen dari kategori sintaksisstatement
adalahdeclaration statement
).Jawaban:
The
{}
menunjukkan blok baru dari lingkup .Pertimbangkan contoh yang sangat dibuat-buat berikut:
Anda akan mendapatkan kesalahan kompilator karena
x
sudah ditentukan dalam ruang lingkup.Memisahkan ini ke sub-cakupannya sendiri akan menghilangkan kebutuhan untuk mendeklarasikan di
x
luar pernyataan switch.sumber
TL; DR
Satu-satunya cara Anda dapat mendeklarasikan variabel dengan intializer atau objek non-sepele di dalam kasus adalah dengan memperkenalkan cakupan blok menggunakan
{}
atau struktur kontrol lain yang memiliki ruang lingkup sendiri seperti loop atau pernyataan if .Detail berdarah
Kita dapat melihat bahwa kasus hanyalah pernyataan berlabel seperti label yang digunakan dengan pernyataan goto ( ini tercakup dalam standar draf C ++ bagian 6.1 Pernyataan berlabel ) dan kita dapat melihat dari bagian
6.7
paragraf 3 bahwa melompati deklarasi tidak diperbolehkan dalam banyak kasus , termasuk yang memiliki inisialisasi:dan memberikan contoh ini:
Perhatikan, ada beberapa kehalusan di sini, Anda diizinkan untuk melewati deklarasi skalar yang tidak memiliki inisialisasi, misalnya:
benar-benar valid ( contoh langsung ). Tentu saja jika Anda ingin mendeklarasikan variabel yang sama dalam setiap kasus maka mereka masing-masing akan membutuhkan ruang lingkupnya sendiri tetapi bekerja dengan cara yang sama di luar pernyataan switch juga, jadi itu seharusnya tidak menjadi kejutan besar.
Adapun alasan untuk tidak mengizinkan inisialisasi lompatan melewati, laporan kerusakan 467 meskipun mencakup masalah yang sedikit berbeda memberikan kasus yang wajar untuk variabel otomatis :
Mungkin lebih menarik untuk melihat kasus di mana Anda memperluas cakupan dalam sebuah sakelar ke beberapa kasus. Contoh paling terkenal dari ini mungkin adalah perangkat Duff yang akan terlihat seperti ini:
sumber
Ini adalah kebiasaan yang memungkinkan Anda memasukkan deklarasi variabel dengan destruktor yang dihasilkan (atau konflik cakupan) ke dalam
case
klausa. Cara lain untuk melihatnya adalah mereka menulis untuk bahasa yang mereka inginkan, di mana semua kontrol aliran terdiri dari blok dan bukan urutan pernyataan.sumber
Periksa ini sebagai batasan kompiler dasar dan Anda akan mulai bertanya-tanya apa yang terjadi:
Ini akan memberi Anda kesalahan:
Meskipun yang ini tidak akan:
sumber
Menggunakan tanda kurung di sakelar menunjukkan blok ruang lingkup baru seperti yang dikatakan oleh Rotem.
Tapi bisa juga untuk kejelasan saat Anda membaca. Untuk mengetahui di mana kasus ini berhenti karena Anda mungkin mengalami break conditionnal di dalamnya.
sumber
Alasannya mungkin:
sumber