Kalau kamu tidak punya penghitung
for loop dibangun di sekitar penghitung yang kamu siapkan di awal. Tapi banyak perulangan yang tidak punya hitungan yang jelas: terus membaca angka sampai input habis, terus meminta password sampai benar, terus membagi dua sebuah nilai sampai mencapai 1. Untuk kasus-kasus itu, while loop adalah pilihan yang alami: ia hanya mengulang selama sebuah kondisi tetap bernilai true.
while loop mengecek kondisinya sebelum setiap putaran, termasuk putaran yang paling pertama. Kalau sejak awal kondisinya false, isinya tidak pernah dijalankan sama sekali.
Kondisi count > 0 dicek lebih dulu; kalau true, isinya dijalankan, lalu kita kembali dan mengecek lagi. Baris count-- itulah yang pada akhirnya membuat kondisinya false. Hapus baris itu, maka loop akan berjalan selamanya.
Anatomi while loop
Bandingkan dengan for loop tiga bagian yang sudah kamu kenal. while loop memisahkan ketiga tugas itu: persiapan dilakukan sebelum loop, kondisi ditaruh di dalam tanda kurung, dan pembaruan tinggal di dalam isi loop.
int i = 0; // initialization - before the loop
while (i < 5) { // condition - checked each pass
cout << i << "\n";
i++; // update - you must remember this yourself
}
Bagian terakhir itulah jebakannya. Di for loop, pembaruan berada tepat di sebelah kondisi, jadi sulit terlupa. Di while loop, ia hanyalah pernyataan biasa di dalam isi loop, dan bug yang paling umum adalah melupakannya sehingga program macet.
Satu jebakan C++ yang sering mengenai pemula: titik koma yang nyasar tepat setelah kondisi mengubah isi loop menjadi pernyataan kosong.
int i = 0;
while (i < 5); // <-- this semicolon is the entire loop body
{
cout << i << "\n";
i++;
}
Loop itu berjalan selamanya tanpa melakukan apa-apa, karena ; adalah isi loop-nya dan i tidak pernah berubah. Blok di dalam kurung kurawal kemudian berjalan tepat satu kali. Compiler tidak akan menghentikanmu: kodenya sah sepenuhnya, hanya saja bukan itu yang kamu maksud.
do-while: jalankan isinya minimal sekali
Kadang kamu butuh isinya berjalan sekali dulu sebelum kamu bahkan bisa memutuskan apakah perlu diulang. Loop do-while mengecek kondisinya di bagian bawah, jadi isinya selalu dijalankan minimal satu kali:
Kamu harus meminta dan membaca input minimal sekali sebelum bisa tahu apakah input-nya valid, dan itulah yang diberikan do-while. Perhatikan titik koma setelah while (...): di C++ titik koma itu wajib untuk do-while, dan melupakannya adalah error kompilasi yang sering terjadi.
Perbedaannya dengan while biasa terlihat jelas saat kondisinya sejak awal false:
Hanya do-while body yang dicetak. Loop while melewati isinya sepenuhnya karena x < 5 sudah false sebelum pengecekan pertama.
Perulangan sampai cin gagal
Pemakaian while yang klasik adalah membaca sampai input berhenti: tidak ada penghitung, kamu terus berjalan sampai stream menyuruhmu berhenti. Di C++, cin >> value menghasilkan stream itu sendiri, yang bernilai truthy selama pembacaan berhasil dan falsy begitu mencapai akhir input atau tipe yang tidak cocok. Itu membuatnya menjadi kondisi loop yang rapi:
Kondisinya melakukan dua tugas sekaligus: membaca dan menguji dalam satu langkah. Bandingkan dengan nilai sentinel, misalnya berhenti saat bertemu 0. Di sana kamu harus membaca sekali sebelum loop dan sekali lagi di bagian bawah setiap putaran, supaya kondisinya selalu menguji input yang baru:
Kalau kamu lupa pembacaan kedua di dalam isi loop, value tidak pernah berubah dan kamu mendapat infinite loop. Bentuk while (cin >> value) menghindari masalah itu dengan menyatukan pembacaan ke dalam kondisi.
break dan continue di while loop
break dan continue bekerja sama seperti di for loop. break langsung keluar dari loop; continue langsung melompat kembali ke pengecekan kondisi, melewati sisa putaran saat ini:
Ini mencetak 1 3 5 7 9. while (true) itu sengaja dibuat tidak pernah berhenti sendiri: break adalah satu-satunya jalan keluar. Hati-hati dengan continue di while loop: karena pembaruan adalah bagian dari isi loop, melompat kembali ke atas dengan continue sebelum kamu memajukan penghitung adalah cara diam-diam untuk membuat loop macet. Di contoh di atas n++ dijalankan lebih dulu, jadi aman.
Waspadai infinite loop
Kondisinya pada akhirnya harus menjadi false, dan itu sepenuhnya bergantung pada sesuatu di dalam isi loop yang berubah. Dua penyebab yang biasa adalah lupa melakukan pembaruan, dan pembaruan yang melompati nilai keluarnya:
int i = 0;
while (i < 5) {
cout << i << "\n"; // i never changes -> runs forever
}
int i = 0;
while (i != 10) {
i += 3; // 0, 3, 6, 9, 12... steps right past 10 -> runs forever
}
Yang pertama macet karena i tidak pernah diperbarui. Yang kedua macet karena penghitungnya melangkahi nilai persis yang dicari kondisinya. Pilih < atau <= daripada != saat langkahnya mungkin tidak mendarat tepat di nilai itu. while (true) tidak masalah asalkan ia punya break yang pasti terjadi; yang tidak disengaja hanyalah bug. Dan ingat jebakan isi kosong while (...); dari bagian sebelumnya: titik koma yang salah tempat menghasilkan infinite loop yang sekilas terlihat benar.
Berikutnya: range-based for loop
while loop adalah alat yang tepat saat kamu mengulang sampai sebuah kondisi berubah dan tidak ada hitungan yang jelas. Tapi saat kamu hanya ingin mengunjungi setiap elemen sebuah container (vector, array, string) tanpa indeks dan tanpa kondisi yang perlu diatur, C++ modern punya cara yang lebih rapi: range-based for loop (for (auto x : container)). Itulah halaman berikutnya.
Pertanyaan yang sering diajukan
Apa perbedaan while dan do-while di C++?
Loop while mengecek kondisinya sebelum putaran pertama, jadi isinya bisa dijalankan nol kali. Loop do-while menjalankan isinya sekali lebih dulu, lalu mengecek kondisi di bagian bawah, sehingga selalu berjalan minimal sekali. Pakai do-while saat pekerjaannya harus terjadi dulu sebelum kamu bisa memutuskan apakah perlu diulang, seperti meminta input lalu memvalidasinya. Perhatikan bahwa do-while butuh titik koma setelah while (...) penutupnya.
Kapan sebaiknya memakai while loop alih-alih for loop di C++?
Pakai loop while saat kamu tidak punya penghitung yang jelas dan hanya ingin mengulang sampai suatu kondisi berubah: membaca input sampai cin gagal, menunggu sampai sebuah nilai siap, atau memproses antrean sampai kosong. Pakai loop for saat kamu tahu jumlah iterasinya atau punya indeks yang jelas untuk dihitung.
Bagaimana cara menghentikan while loop yang tidak pernah berhenti di C++?
Pastikan ada sesuatu di dalam isi loop yang pada akhirnya membuat kondisinya false (mengurangi penghitung, memajukan pointer, mengubah flag). Untuk loop while (true) yang disengaja, taruh break di dalamnya yang dilindungi if. Kalau sebuah loop macet, penyebab biasanya adalah lupa memperbarui variabel yang menjadi dasar kondisinya.