Saya ingin melompat dari tengah switch
pernyataan, ke pernyataan loop dalam kode berikut:
while (something = get_something())
{
switch (something)
{
case A:
case B:
break;
default:
// get another something and try again
continue;
}
// do something for a handled something
do_something();
}
Apakah ini cara yang valid untuk digunakan continue
? Apakah continue
pernyataan diabaikan oleh switch
pernyataan? Apakah C dan C ++ berbeda dalam perilakunya di sini?
do_something()
.goto
.Jawaban:
Tidak apa-apa,
continue
pernyataan tersebut terkait dengan loop yang melingkupi, dan kode Anda harus setara dengan (menghindari pernyataan lompat seperti itu):while (something = get_something()) { if (something == A || something == B) do_something(); }
Tetapi jika Anda berharap
break
untuk keluar dari loop, seperti yang disarankan oleh komentar Anda (selalu mencoba lagi dengan sesuatu yang lain, sampai bernilai false), Anda memerlukan struktur yang berbeda.Sebagai contoh:
do { something = get_something(); } while (!(something == A || something == B)); do_something();
sumber
Ya, tidak apa-apa - ini seperti menggunakannya dalam
if
pernyataan. Tentu saja, Anda tidak dapat menggunakan abreak
untuk keluar dari loop dari dalam sakelar.sumber
if
tidak berpengaruh pada perilakucontinue
ataubreak
. Apa maksudmu itu sama?Ya, lanjutkan akan diabaikan oleh pernyataan sakelar dan akan pergi ke kondisi loop yang akan diuji. Saya ingin membagikan kutipan ini dari referensi Bahasa Pemrograman C oleh Ritchie:
Saya tidak yakin tentang itu untuk C ++.
sumber
Ini benar secara sintaksis dan secara gaya oke.
Gaya yang baik mengharuskan setiap
case:
pernyataan harus diakhiri dengan salah satu dari berikut ini:break; continue; return (x); exit (x); throw (x); //fallthrough
Selain itu,
case (x):
segera ikuti dengancase (y): default:
diperbolehkan - menggabungkan beberapa kasus yang memiliki efek yang persis sama.
Ada lagi yang dicurigai sebagai kesalahan, seperti
if(a=4){...}
Tentu saja Anda perlu melampirkan loop (while
,for
,do...while
) untukcontinue
bekerja. Itu tidak akan berputar kembalicase()
sendirian. Tapi konstruksi seperti:while(record = getNewRecord()) { switch(record.type) { case RECORD_TYPE_...; ... break; default: //unknown type continue; //skip processing this record altogether. } //...more processing... }
...baik-baik saja.
sumber
exit
biasanya juga merupakan hal yang baik untuk mengakhiri kasus sakelar.default:
tidak harus menjadi entri terakhir / terbawah - seperti yang ditunjukkan oleh pertanyaan ini ...default:
kasus sebagai yang pertama daripada yang terakhir. Seperti "lakukan ini, kecuali Anda mendapatkan nilai yang tidak biasa berikut, yang harus ditangani sebagai berikut".Meskipun secara teknis valid, semua lompatan ini mengaburkan aliran kontrol - terutama
continue
pernyataannya.Saya akan menggunakan trik seperti itu sebagai pilihan terakhir, bukan yang pertama.
Bagaimana tentang
while (something = get_something()) { switch (something) { case A: case B: do_something(); } }
Ini lebih pendek dan melakukan tugasnya dengan cara yang lebih jelas.
sumber
Ini mungkin megabit sampai terlambat tetapi Anda bisa menggunakannya
continue 2
.Beberapa build / config php akan menampilkan peringatan ini:
Sebagai contoh:
$i = 1; while ($i <= 10) { $mod = $i % 4; echo "\r\n out $i"; $i++; switch($mod) { case 0: break; case 2: continue; break; default: continue 2; break; } echo " is even"; }
Ini akan menghasilkan:
out 1 out 2 is even out 3 out 4 is even out 5 out 6 is even out 7 out 8 is even out 9 out 10 is even
Diuji dengan PHP 5.5 dan yang lebih tinggi.
sumber
Switch tidak dianggap sebagai loop sehingga Anda tidak dapat menggunakan Continue inside a case statement in switch ...
sumber
switch
pernyataan di dalamwhile
loop, sehinggacontinue
benar-benar berlaku.