Saya sedang membaca Mengapa kita harus menggunakan break
di switch
? , dan itu membuat saya bertanya-tanya mengapa fall-through implisit diizinkan dalam beberapa bahasa (seperti PHP dan JavaScript), sementara tidak ada dukungan (AFAIK) untuk fall-through eksplisit.
Ini tidak seperti kata kunci baru yang perlu dibuat, karena continue
akan sangat tepat, dan akan menyelesaikan masalah ambiguitas untuk apakah penulis bermaksud untuk menyelesaikan kasus.
Formulir yang saat ini didukung adalah:
switch (s) {
case 1:
...
break;
case 2:
... //ambiguous, was break forgotten?
case 3:
...
break;
default:
...
break;
}
Sedangkan akan masuk akal untuk ditulis sebagai:
switch (s) {
case 1:
...
break;
case 2:
...
continue; //unambiguous, the author was explicit
case 3:
...
break;
default:
...
break;
}
Untuk keperluan pertanyaan ini, mari kita abaikan masalah apakah fall-throughs adalah gaya pengkodean yang baik atau tidak.
Apakah ada bahasa yang ada yang memungkinkan fall-through dan membuatnya eksplisit?
Apakah ada alasan historis yang switch
memungkinkan kejatuhan tersirat alih-alih eksplisit?
switch-statement
zzzzBov
sumber
sumber
goto case
, sehingga alasan pertanyaan Anda agak salah.goto case
di C #.goto case
, seperti disebutkan pdr.Jawaban:
Ini terutama historis, sebagian besar bahasa hanya menyalin apa yang dilakukan C.
Alasan bahwa C melakukannya dengan cara itu adalah bahwa pencipta C berniat beralih pernyataan agar mudah dioptimalkan ke dalam tabel lompatan. Ini juga alasan bahwa C membatasi pernyataan beralih ke nilai integral.
Dalam tabel lompatan, program akan menghitung posisi apa yang harus dilompati berdasarkan ekspresi. Program akan melompat ke titik itu dan kemudian melanjutkan mengeksekusi dari titik itu. Jika Anda ingin melewati sisa tabel Anda harus memasukkan lompatan ke ujung tabel. C menggunakan
break
pernyataan eksplisit sehingga ada korespondensi langsung dengan konstruk ini.sumber
break
dan hanya kurang dari 3% yang jatuh-melalui . Dia kemudian menggunakan ini sebagai contoh bahwa perilaku default fall-through adalah kontra-intuitif dan akan lebih baik jika dibalik (gunakan kata kunci untuk menunjukkan fall-through eksplisit). Oh, dan buku ini sangat bagus untuk menjelaskan keanehan C lainnya, beberapa di antaranya ditemukan di C ++ dan bahkan di C # dan Java juga! Semuanya berakar pada B dan BCPL. :)case
, selain yang pertama, harus diawali secara otomatisbreak
, tetapi yang bertanda+case
(atau beberapa penanda lainnya) tidak boleh. Itu akan mudah bagi kompiler untuk menangani dan memungkinkan keuntungan semantik dari pengaturan ini, sambil menghilangkan banyak baris kode.Go memungkinkan fallthrough eksplisit menggunakan
fallthrough
kata kunci (break implisit, tetapi mungkin eksplisit):Inilah bagian yang relevan dari langkah efektif dan spesifikasi bahasa .
Saya tidak berpikir Anda dapat menggunakan
goto
untuk pergi ke kasus tertentu, tetapi Anda dapat membuat label di dalam kasus ini dan menggunakangoto
seperti biasa.Sebagai bonus, Go memungkinkan Anda menggunakan ekspresi biner, string, atau tipe dalam switch sebagai pernyataan kasus.
sumber