Kenapa for Loop
switch memilih satu cabang untuk dijalankan sekali. Namun program sungguhan perlu melakukan sesuatu berulang kali: mencetak setiap skor, menjumlahkan daftar angka, menggambar 10 baris grid. for loop adalah andalan C++ untuk mengulang kode sebanyak jumlah yang sudah diketahui, dengan penghitung bawaan yang kamu kendalikan.
Semua yang dibutuhkan for loop ada di satu header yang ringkas, jadi seluruh cerita "berapa kali dan bagaimana" langsung terlihat sekilas.
Header Tiga Bagian
Header for loop punya tiga bagian yang dipisahkan titik koma: inisialisasi, kondisi, dan update.
for (initializer; condition; update) {
// body - runs while condition is true
}
Ketiganya dijalankan dengan urutan tertentu: inisialisasi berjalan sekali di awal; lalu kondisi dicek sebelum setiap iterasi; isi loop hanya berjalan kalau kondisinya true; dan update berjalan di akhir setiap iterasi, tepat sebelum kondisi dicek lagi.
Di sini int i = 0 berjalan sekali. Lalu i < 5 dicek: selama kondisi itu terpenuhi, isi loop mencetak dan i++ menaikkan penghitungnya. Saat i mencapai 5, kondisinya false, jadi loop selesai dan done dicetak. Isi loop berjalan tepat 5 kali, dengan i bernilai 0 sampai 4.
Mendeklarasikan penghitung di dalam header (int i = 0) membuat scope i terbatas pada loop. Ia tidak ada lagi setelah kurung kurawal penutup, dan memang itulah yang kamu inginkan.
Menghitung Naik, Turun, dan dengan Langkah Tertentu
Bagian update tidak terbatas pada i++. Kamu bisa menghitung mundur, melangkah sebanyak berapa pun, atau melakukan perulangan pada indeks array.
Loop pertama berjalan selama i > 0, berkurang setiap kali, jadi ia mencetak 5 4 3 2 1. Loop kedua menambahkan 2 di setiap putaran dan memakai <= 10 karena 10 adalah nilai yang ingin kita sertakan. Sesuaikan kondisi dengan update-nya: menghitung mundur berpasangan dengan > atau >=, menghitung naik dengan < atau <=.
Perulangan pada Array
Pemakaian loop penghitung yang paling umum adalah menelusuri array berdasarkan indeks. Penghitungnya sekaligus menjadi posisi yang kamu baca.
Perhatikan kondisinya adalah i < n, bukan i <= n. Array berisi 5 elemen punya indeks valid 0 sampai 4; indeks 5 sudah melewati ujungnya. Membaca scores[5] adalah undefined behavior: bisa mencetak sampah, crash, atau terlihat berfungsi sambil diam-diam merusak memori. Pola i < n adalah default yang aman untuk array apa pun yang indeksnya dimulai dari nol.
Kalau kamu hanya butuh nilainya dan bukan indeksnya, range-based for lebih rapi. Pakai loop berindeks yang klasik saat kamu memang butuh posisinya.
break dan continue
Dua kata kunci membuatmu bisa mengubah alur di tengah loop. break langsung keluar dari loop; continue melewati sisa iterasi saat ini dan melompat ke update.
Loop pertama berhenti begitu menemukan 7 dan tidak pernah mengecek sisanya. Loop kedua memakai continue untuk melewati pencetakan setiap kali i genap; update i++ tetap berjalan, jadi loop terus maju. Jebakan halusnya: continue melompat ke update, jadi kalau kamu memakai continue di dalam loop yang penghitungnya di-update di dalam isi loop alih-alih di header, kamu bisa tidak sengaja melewati update itu dan loop berputar selamanya.
Loop Bersarang
Taruh satu for di dalam loop lain untuk bekerja dengan grid, tabel, atau pasangan. Loop dalam berjalan sampai selesai untuk setiap satu langkah loop luar.
Program ini mencetak grid perkalian 3x3. Loop luar menetapkan satu row, loop dalam menyapu setiap col untuk baris itu, lalu baris baru mengakhiri baris tersebut. Beri penghitung nama yang berbeda (row/col, bukan i/i): memakai ulang satu nama akan menutupi penghitung luar dan menghasilkan bug yang membingungkan. Perhatikan juga biayanya: menaruh loop n di dalam loop n menjalankan isinya n * n kali, yang cepat membengkak.
Jebakan Umum
Beberapa jebakan menjadi penyebab sebagian besar bug for loop di C++:
- Off-by-one:
i <= ndengan ukuran yang dimulai dari nol membaca satu elemen melewati ujungnya. Pakaii < n. - Underflow unsigned: menghitung mundur dengan tipe unsigned tidak pernah menjadi negatif.
for (size_t i = n - 1; i >= 0; i--)berputar selamanya, karenai >= 0selalu benar untuk nilai unsigned: saatibernilai0,i--berputar balik menjadi bilangan positif yang sangat besar. Pakaiintyang signed untuk hitungan mundur, atau tulis ulang kondisinya. - Mengubah penghitung di dalam isi loop: mengubah
idi isi loop sekaligus di header membuat jumlah perulangan tidak bisa ditebak. Pilih satu tempat saja.
// BUG: infinite loop - unsigned i is never < 0
for (size_t i = n - 1; i >= 0; i--) {
process(arr[i]);
}
Penghitung floating-point adalah bahaya diam-diam lainnya: for (double x = 0.0; x != 1.0; x += 0.1) mungkin tidak pernah tepat mengenai 1.0 karena 0.1 tidak bisa disimpan secara presisi. Lakukan perulangan dengan hitungan bilangan bulat dan hitung nilainya di dalam loop, atau pakai < alih-alih !=.
Berikutnya: while Loop
for loop unggul saat kamu sudah tahu jumlahnya sejak awal. Namun kadang kamu perlu mengulang sampai sebuah kondisi berubah, misalnya membaca input sampai akhir file atau mencoba lagi sampai berhasil, tanpa jumlah langkah yang tetap. Itulah tugas while loop, yang memangkas header-nya menjadi hanya sebuah kondisi. Itu topik halaman berikutnya.
Pertanyaan yang sering diajukan
Bagaimana cara menulis for loop di C++?
Tulis tiga bagian di header yang dipisahkan titik koma: inisialisasi, kondisi, dan update. for (int i = 0; i < 5; i++) { cout << i; } menjalankan isi loop dengan i bernilai 0, 1, 2, 3, 4. Loop berhenti begitu kondisinya menjadi false.
Apa perbedaan for loop dan range-based for loop di C++?
for klasik memberimu penghitung indeks yang kamu kendalikan (for (int i = 0; i < n; i++)), yang kamu butuhkan saat ingin tahu posisinya atau ingin melangkah dengan cara khusus. Range-based for (for (int x : v)) menyembunyikan indeksnya dan langsung memberimu setiap elemen, lebih rapi kalau kamu hanya butuh nilainya.
Kenapa for loop C++ milikku berjalan satu kali terlalu banyak atau terlalu sedikit?
Itu bug off-by-one yang klasik. Memakai <= alih-alih < dengan ukuran yang dimulai dari nol menjalankan satu iterasi tambahan dan membaca melewati ujung array; memakai < padahal kamu ingin menyertakan nilai terakhir membuat loop kurang satu. Untuk array berukuran n, pola yang aman adalah for (int i = 0; i < n; i++).