Jika saya menggunakan break
pernyataan, itu hanya akan merusak loop dalam dan saya perlu menggunakan beberapa bendera untuk memutus loop luar. Tetapi jika ada banyak loop bersarang, kode tidak akan terlihat bagus.
Apakah ada cara lain untuk memutuskan semua loop? (Tolong jangan gunakan goto stmt
.)
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; j++) {
if(condition) {
// both of the loops need to break and control will go to stmt2
}
}
}
stmt2
c
nested-loops
break
pengguna966379
sumber
sumber
Jawaban:
Menggunakan:
sumber
const int count =1000
, dalam Inisialisasi global. atau sebagai#define
makro.Tidak, jangan merusak kesenangan dengan
break
. Ini adalah sisa penggunaan sah yang terakhir darigoto
;)Jika tidak demikian, Anda dapat menggunakan flag untuk keluar dari loop bersarang yang dalam.
Pendekatan lain untuk keluar dari loop bersarang adalah dengan memfaktorkan kedua loop menjadi fungsi terpisah, dan kembali dari fungsi tersebut saat Anda ingin keluar.
Diringkas - untuk keluar dari loop bersarang:
goto
Tidak bisa menahan termasuk xkcd di sini :)
sumber
Goto dianggap berbahaya tetapi seperti yang disarankan oleh banyak orang di komentar, itu tidak perlu. Jika digunakan dengan bijaksana, ini bisa menjadi alat yang hebat. Apa pun yang digunakan secukupnya itu menyenangkan.
sumber
sumber
Salah satu caranya adalah dengan menempatkan semua loop bersarang ke dalam suatu fungsi dan kembali dari loop paling dalam jika perlu keluar dari semua loop.
sumber
Saya pikir
goto
akan menyelesaikan masalahsumber
Anda memerlukan variabel boolean, jika Anda ingin dapat dibaca:
Jika Anda ingin membuatnya kurang mudah dibaca, Anda dapat mengikuti evaluasi boolean:
Sebagai cara pamungkas Anda dapat membatalkan pengulangan awal:
sumber
Gunakan nasihat bijak ini dari tim LLVM:
"Ubah Predicate Loops menjadi Predicate Functions"
Lihat:
http://llvm.org/docs/CodingStandards.html#turn-predicate-loops-into-predicate-functions
sumber
Perhatian: Jawaban ini menunjukkan konstruksi yang benar-benar tidak jelas.
Jika Anda menggunakan GCC, lihat pustaka ini . Seperti di PHP,
break
dapat menerima jumlah loop bersarang yang ingin Anda keluar. Anda bisa menulis sesuatu seperti ini:sumber
goto
:)goto
) jauh lebih disukai daripada inline asm (spesifik mesin, lebih mudah membuat kesalahan, lebih sulit dibaca, ...).sumber
Jika Anda membutuhkan nilai i dan j, ini harus berfungsi tetapi dengan kinerja yang lebih rendah daripada yang lain
sumber
j
nilai kondisi perlu disimpan dengan beberapa cara agar ini tetap berfungsi.for (int i = 0; i < 1000; i++) { for (int j = 0; j < 1000; j++) { if (workComplete[i][j]) break; /* do work */ workComplete[i][j] = true; } if (workComplete[i][j]) break; ... }
akan selalu keluar dari loop luar setelah iterasi pertama dari loop dalam.Akan mematahkan kedua loop.
sumber
sumber
condition
menjadi salah. Oh, dan loop kedua akan berjalan selamanya karena itu bertambah,i
bukanj
, ups ...sumber