Apakah mungkin untuk menggunakan break
fungsi untuk keluar dari beberapa for
loop bersarang ?
Jika demikian, bagaimana Anda akan melakukan ini? Bisakah Anda juga mengontrol berapa banyak loop break
keluar?
c++
for-loop
break
nested-loops
Faken
sumber
sumber
Jawaban:
AFAIK, C ++ tidak mendukung loop penamaan, seperti Java dan bahasa lainnya. Anda dapat menggunakan goto, atau membuat nilai bendera yang Anda gunakan. Pada akhir setiap loop periksa nilai flag. Jika disetel ke true, maka Anda dapat keluar dari iterasi itu.
sumber
goto
jika itu pilihan terbaik.goto
: Pemrogram yang buruk, dan pemrogram yang pragmatis. Yang pertama cukup jelas. Yang terakhir, yang akan Anda cocokkan jika Anda memilih untuk menggunakannya dengan baik, menggunakan konsep yang disebut "jahat" ketika itu adalah yang lebih rendah dari (dua) kejahatan. Baca ini untuk pemahaman yang lebih baik tentang beberapa konsep C ++ yang mungkin perlu Anda gunakan dari waktu ke waktu (makro, goto, preprocessor, array): parashift.com/c++-faq-lite/big-picture.html#faq-6.15goto
jarang menggunakan adalah pilihan terbaik. Mengapa tidak menempatkan loop ke dalam fungsinya sendiri (inline
, jika Anda khawatir tentang kecepatan) danreturn
dari sini?Tidak, jangan merusaknya dengan
break
. Ini adalah benteng terakhir yang tersisa untuk penggunaangoto
.sumber
Hanya untuk menambahkan jawaban eksplisit menggunakan lambdas:
Tentu saja pola ini memiliki batasan tertentu dan jelas C ++ 11 saja, tetapi saya pikir ini cukup berguna.
sumber
Pendekatan lain untuk keluar dari nested loop adalah memfaktorkan kedua loop ke fungsi yang terpisah, dan
return
dari fungsi itu saat Anda ingin keluar.Tentu saja, ini memunculkan argumen lain apakah Anda harus secara eksplisit
return
dari suatu fungsi selain dari pada bagian akhir.sumber
continue_processing
) yang mengontrol pelaksanaan blok kode lebih jauh dalam fungsi.break akan keluar hanya loop paling dalam yang berisi itu.
Anda dapat menggunakan goto untuk keluar dari sejumlah loop.
Tentu saja goto sering dianggap berbahaya .
Menggunakan break dan goto dapat mempersulit alasan tentang kebenaran suatu program. Lihat di sini untuk diskusi tentang ini: Dijkstra tidak gila .
sumber
break
ataureturn
.break
danreturn
dapatkan keunggulannyagoto
karena Anda tidak perlu mencari label untuk menemukan kemana mereka pergi. Ya, di bawahnya ada beberapagoto
, tapi yang sangat terbatas. Mereka jauh lebih mudah diurai oleh otak pencocokan pola programmer daripada yang tidak dibatasigoto
. Jadi IMO mereka lebih disukai.goto
.Meskipun jawaban ini sudah dipresentasikan, saya pikir pendekatan yang baik adalah dengan melakukan hal berikut:
sumber
gotoMainLoop
dicentang setiap siklusgoto
membuat inti lebih mudah dibaca dan berkinerja lebih baik.Bagaimana dengan ini?
sumber
Contoh kode menggunakan
goto
dan label untuk keluar dari loop bersarang:sumber
Salah satu cara yang bagus untuk keluar dari beberapa loop bersarang adalah untuk memperbaiki kode Anda menjadi sebuah fungsi:
sumber
goto bisa sangat membantu untuk memecahkan loop bersarang
sumber
dari msdn .
sumber
Saya pikir a
goto
valid dalam keadaan ini:Untuk mensimulasikan
break
/continue
, Anda ingin:Istirahat
Terus
sumber
i
. Oleh karena itui++
sebelum gotoBahasa lain seperti PHP menerima parameter untuk break (yaitu break 2;) untuk menentukan jumlah level loop bersarang yang ingin Anda hilangkan, namun C ++ tidak. Anda harus menyelesaikannya dengan menggunakan boolean yang Anda atur ke false sebelum loop, atur true dalam loop jika Anda ingin istirahat, ditambah istirahat bersyarat setelah loop bersarang, memeriksa apakah boolean disetel ke true dan hancurkan jika ya.
sumber
Saya tahu ini posting lama. Tetapi saya akan menyarankan jawaban yang sedikit logis dan lebih sederhana.
sumber
j = conditionj
tidak akan berfungsi jika Anda memiliki predikat yang kompleksj < conditionj
.Break sejumlah loop hanya dengan satu
bool
variabel lihat di bawah:Dalam kode ini kita
break;
semua loop.sumber
Saya tidak yakin apakah itu layak, tetapi Anda dapat meniru loop bernama Java dengan beberapa makro sederhana:
Contoh penggunaan:
Contoh lain:
sumber
sumber
Anda bisa menggunakan try ... catch.
Jika Anda harus keluar dari beberapa loop sekaligus, seringkali merupakan pengecualian.
sumber
Melepaskan for-loop sedikit aneh bagi saya, karena semantik for-loop biasanya menunjukkan bahwa ia akan mengeksekusi beberapa kali. Namun, itu tidak buruk dalam semua kasus; jika Anda mencari sesuatu di koleksi dan ingin menghancurkan setelah Anda menemukannya, itu berguna. Melepaskan dari loop bersarang, bagaimanapun, tidak mungkin di C ++; itu dalam bahasa lain melalui penggunaan jeda berlabel. Anda bisa menggunakan label dan goto, tapi itu mungkin membuat Anda mulas di malam hari ..? Sepertinya pilihan terbaik.
sumber