Banyak jawaban tampaknya berfokus pada kemampuan untuk jatuh sebagai alasan untuk membutuhkannyabreak
pernyataan itu.
Saya percaya itu hanya kesalahan, karena sebagian besar karena ketika C dirancang, tidak ada banyak pengalaman dengan bagaimana konstruksi ini akan digunakan.
Peter Van der Linden membuat kasus ini dalam bukunya "Expert C Programming":
Kami menganalisis sumber kompiler Sun C untuk melihat seberapa sering jatuh standar digunakan. Ujung depan kompilator Sun ANSI C memiliki 244 pernyataan switch, yang masing-masing memiliki rata-rata tujuh kasus. Kejatuhan terjadi hanya dalam 3% dari semua kasus ini.
Dengan kata lain, perilaku saklar normal salah 97% dari waktu. Bukan hanya di kompiler - sebaliknya, di mana fall through digunakan dalam analisis ini, itu sering untuk situasi yang terjadi lebih sering di kompiler daripada di perangkat lunak lain, misalnya, ketika mengkompilasi operator yang dapat memiliki satu atau dua operan :
switch (operator->num_of_operands) {
case 2: process_operand( operator->operand_2);
/* FALLTHRU */
case 1: process_operand( operator->operand_1);
break;
}
Kasus jatuh begitu banyak diakui sebagai cacat sehingga bahkan ada konvensi komentar khusus, yang ditunjukkan di atas, yang memberitahu serat "ini benar-benar salah satu dari 3% kasus di mana jatuh diinginkan."
Saya pikir itu ide yang baik untuk C # untuk meminta pernyataan lompatan eksplisit di akhir setiap blok kasus (sementara masih memungkinkan beberapa label kasus ditumpuk - selama hanya ada satu blok pernyataan). Dalam C # Anda masih dapat memiliki satu kasus jatuh ke yang lain - Anda hanya perlu membuat jatuh melalui eksplisit dengan melompat ke kasus berikutnya menggunakangoto
.
Sayang sekali Java tidak mengambil kesempatan untuk istirahat dari semantik C.
Dalam banyak hal c hanyalah antarmuka yang bersih untuk idiom perakitan standar. Ketika menulis tabel kontrol aliran didorong lompat, programmer memiliki pilihan jatuh melalui atau melompat keluar dari "struktur kontrol", dan lompat keluar membutuhkan instruksi eksplisit.
Jadi, c melakukan hal yang sama ...
sumber
NULL
. (Lanjutan dalam komentar berikutnya.)NUL
string yang dimusnahkan adalah tentang ide terburuk yang pernah ada.DO
loop Fortran .Untuk mengimplementasikan perangkat Duff, jelas:
sumber
Jika case dirancang untuk pecah secara implisit maka Anda tidak bisa gagal.
Jika saklar dirancang untuk keluar secara implisit setelah setiap kasus Anda tidak akan punya pilihan tentang hal itu. Struktur sakelar didesain sedemikian rupa agar lebih fleksibel.
sumber
Pernyataan kasus dalam pernyataan switch hanyalah label.
Ketika Anda mengaktifkan nilai, pernyataan switch pada dasarnya melakukan kebohongan ke label dengan nilai yang cocok.
Ini berarti bahwa istirahat diperlukan untuk menghindari melewati kode di bawah label berikutnya.
Adapun alasan mengapa itu diterapkan dengan cara ini - sifat fall-through dari pernyataan switch dapat berguna dalam beberapa skenario. Sebagai contoh:
sumber
break
mana dibutuhkan. 2) Jika pernyataan kasus diubah pesanannya, fallthrough dapat mengakibatkan kasus yang salah dijalankan. Jadi, saya menemukan penanganan C # jauh lebih baik (eksplisitgoto case
untuk fallthrough, kecuali untuk label case kosong).break
di C # juga - yang paling sederhana adalah ketika Anda tidak ingincase
melakukan apa pun kecuali lupa untuk menambahkanbreak
(mungkin Anda begitu sibuk dengan komentar penjelasan, atau dipanggil untuk beberapa tugas lain): eksekusi hanya akan jatuh kecase
bawah. 2) mendoronggoto case
adalah mendorong pengkodean "spageti" yang tidak terstruktur - Anda dapat berakhir dengan siklus yang tidak disengaja (case A: ... goto case B; case B: ... ; goto case A;
), terutama ketika kasing dipisahkan dalam file dan sulit untuk digabung dalam kombinasi. Dalam C ++, fall-through dilokalkan.Untuk mengizinkan hal-hal seperti:
Pikirkan
case
kata kunci sebagaigoto
label dan itu jauh lebih alami.sumber
if(0)
pada akhir kasus pertama adalah kejahatan, dan hanya boleh digunakan jika tujuannya adalah untuk mengaburkan kode.Ini menghilangkan duplikasi kode ketika beberapa kasus perlu mengeksekusi kode yang sama (atau kode yang sama secara berurutan).
Karena pada tingkat bahasa assembly, tidak masalah apakah Anda menerobos masing-masing atau tidak ada nol overhead untuk kasus jatuh, jadi mengapa tidak mengizinkan mereka karena mereka menawarkan keuntungan yang signifikan dalam kasus-kasus tertentu.
sumber
Saya kebetulan berlari ke dalam kasus penetapan nilai dalam vektor ke struct: itu harus dilakukan sedemikian rupa sehingga jika vektor data lebih pendek dari jumlah anggota data dalam struct, sisa anggota akan tetap di nilai default mereka. Dalam hal menghilangkan
break
itu cukup berguna.sumber
Seperti yang ditentukan di sini, ini memungkinkan satu blok kode berfungsi untuk banyak kasus. Ini seharusnya menjadi kejadian yang lebih umum untuk pernyataan switch Anda daripada "blok kode per kasus" yang Anda tentukan dalam contoh Anda.
Jika Anda memiliki blok kode per kasus tanpa jatuh, mungkin Anda harus mempertimbangkan untuk menggunakan blok if-elseif-else, karena itu akan tampak lebih tepat.
sumber