Perulangan while mengulang isinya selama sebuah kondisi tetap bernilai true. Pakai perulangan ini saat kamu tidak tahu sejak awal berapa iterasi yang dibutuhkan: terus jalan sampai saldo mencapai target, antrean kosong, atau input habis.
Output:
Year 1: 1070.00
Year 2: 1144.90
Year 3: 1225.04
Year 4: 1310.80
Year 5: 1402.55
Year 6: 1500.73
Goal reached after 6 years
Kondisinya diperiksa sebelum setiap iterasi, termasuk iterasi pertama. Kalau savings sudah mencapai target sejak awal, isi loop tidak akan pernah dijalankan dan program akan mencetak "after 0 years". Loop ini bergantung pada isi loop yang mengubah sesuatu yang dibaca kondisi; di sini savings bertambah setiap tahun sampai savings < goal menjadi false.
do while: dijalankan minimal sekali
Perulangan do while memindahkan pemeriksaan ke akhir, jadi isinya selalu dijalankan minimal sekali:
Output:
Attempt 1: got 7
Attempt 2: got 4
Attempt 3: got 1
Done after 3 attempts
Nilai pertama code baru ada setelah isi loop dijalankan sekali, dan di situlah do while cocok dipakai. Ada dua detail sintaks yang sering menjebak:
- Titik koma setelah
while (code != 1)wajib ada. Melupakannya adalah error kompilasi. - Variabel yang dipakai di kondisi harus dideklarasikan sebelum
do. Variabel yang dideklarasikan di dalam kurung kurawal sudah berada di luar scope saat kondisi dijalankan, jadido { int code = ...; } while (code != 1);tidak bisa dikompilasi.
Loop yang sama yang ditulis dengan while butuh pemanggilan pertama yang diduplikasi sebelum loop atau nilai awal palsu yang memaksa putaran pertama terjadi. do while langsung menyatakan "coba dulu, lalu putuskan apakah perlu mencoba lagi".
Membaca input sampai kata penanda
Membaca baris sampai ada kata penghenti, atau sampai input habis, adalah contoh klasik perulangan while. Console.ReadLine() mengembalikan null saat tidak ada input lagi, jadi uji keduanya:
Output:
skipping "abc": not a number
3 amounts, total 49.50
(line = Console.ReadLine()) != null mengisi baris berikutnya dan mengujinya dalam satu ekspresi; tanda kurung di sekitar assignment wajib ada karena != mengikat lebih kuat daripada =. Loop berhenti di done, jadi 99 setelahnya tidak pernah dibaca. decimal.TryParse menolak abc tanpa melempar exception, dan continue melompat ke baris berikutnya. Tanpa pemeriksaan null, saat input habis, null akan dikirim ke TryParse selamanya, karena ReadLine terus mengembalikan null.
do while cocok untuk pola minta-lalu-validasi, saat permintaan input harus muncul minimal sekali:
Output:
Enter your age:
"-4" is not a valid age
Enter your age:
"fifteen" is not a valid age
Enter your age:
Age accepted: 15
Permintaan input ada di dalam loop, jadi muncul lagi setelah setiap jawaban yang ditolak, dan age dideklarasikan sebelum do agar kode setelah loop bisa memakainya. Kalau ada pengguna di depan keyboard, setiap jawaban muncul di console setelah permintaannya; dengan input yang dialihkan, seperti di sini, hanya output program sendiri yang ditampilkan.
while (true) dengan break
Kadang titik keluar yang wajar ada di tengah isi loop, setelah sebagian pekerjaan dan sebelum sisanya. Tulis loop sebagai while (true) dan keluar dengan break:
Output:
processing: resize photo
processing: send email
stop signal received
1 job(s) left in the queue
Dequeue mengambil job berikutnya dari depan queue, dan loop keluar begitu melihat penanda berhenti, jadi job terakhir tetap ada di antrean. while (true) bukan tanda kode yang buruk selama jalan keluarnya jelas dan dekat dengan bagian atas isi loop. Bentuk ini baru menjadi masalah saat ada beberapa break yang tersebar di isi loop yang panjang; dalam kasus itu, kondisi bool yang diberi nama atau method dengan return lebih mudah diikuti. Halaman break dan continue membahas cara keluar dari loop bersarang.
Loop yang tidak pernah berhenti
Infinite loop yang tidak disengaja punya salah satu dari tiga penyebab ini.
Isi loop tidak pernah mengubah kondisi. Counter-nya tidak pernah dinaikkan, atau variabel yang dinaikkan salah:
int i = 0;
while (i < 5)
{
Console.WriteLine(i); // i++ forgotten: prints 0 forever
}
Titik koma setelah kondisi. Titik koma itu adalah seluruh isi loop, dan blok di bawahnya baru dijalankan setelah loop (yang tidak pernah selesai):
while (retries < 3); // warning CS0642: Possible mistaken empty statement
{
retries++;
}
Kondisi yang melompati targetnya. Menguji dengan != saat variabel bergerak dengan langkah tertentu bisa melompati nilai berhentinya. while (x != 10) x += 3; berjalan 0, 3, 6, 9, 12 dan langsung melewati 10 (loop itu baru mengenai 10 secara kebetulan, setelah int mengalami overflow dan berputar balik miliaran langkah kemudian). Uji dengan < atau > alih-alih != setiap kali langkahnya bukan 1. Hal yang sama berlaku untuk nilai double, yang jarang tepat mengenai target: while (x != 1.0) x += 0.1; tidak pernah berhenti.
Memilih antara while, do while, dan for
| Situasi | Loop |
|---|---|
| Jumlah iterasi sudah diketahui, atau ada indeks | for |
| Setiap elemen sebuah collection | foreach |
| Ulangi selama kondisi terpenuhi, mungkin nol kali | while |
| Isi loop harus dijalankan sekali sebelum kondisinya masuk akal | do while |
| Pemeriksaan keluar ada di tengah isi loop | while (true) dengan break |
Setiap perulangan for bisa ditulis ulang sebagai perulangan while dan sebaliknya; pilihannya soal mana yang meletakkan logika loop di tempat yang diharapkan pembaca. Saat counter, pengujian, dan langkahnya semuanya ada, for menyatukannya dalam satu baris. Saat loop digerakkan oleh state yang berubah di dalam isi loop, while menyatakannya dengan jelas.
Pertanyaan yang sering diajukan
Apa bedanya while dan do while di C#?
Perulangan while memeriksa kondisinya sebelum setiap iterasi, jadi isinya bisa tidak dijalankan sama sekali. Perulangan do { } while (condition); memeriksa kondisi setelah setiap iterasi, jadi isinya selalu dijalankan minimal sekali. Pakai do while saat putaran pertama yang menghasilkan nilai yang diuji kondisi, misalnya membaca input lalu memvalidasinya.
Bagaimana sintaks perulangan do while di C#?
do { body } while (condition);. Perhatikan titik koma setelah tanda kurung penutup: titik koma itu wajib, dan melupakannya adalah error kompilasi. Kondisinya boleh memakai variabel yang diisi di dalam isi loop, tetapi variabel itu harus dideklarasikan sebelum do, karena kurung kurawal isi loop adalah scope tersendiri.
Bagaimana cara menulis while (true) di C#?
while (true) { ... } berulang terus sampai ada sesuatu di dalamnya yang keluar dengan break, return atau exception. Ini bentuk yang wajar saat pemeriksaan untuk keluar ada di tengah isi loop, misalnya membaca sebuah baris lalu berhenti saat baris itu kosong.
Bagaimana cara membaca input sampai pengguna mengetik sebuah kata atau input habis di C#?
Buat loop dengan Console.ReadLine(), yang mengembalikan null di akhir input: string line; while ((line = Console.ReadLine()) != null && line != "done") { ... }. Assignment di dalam kondisi membaca baris berikutnya dan mengujinya dalam satu langkah.
Kenapa perulangan while saya di C# tidak pernah berhenti?
Biasanya isi loop tidak pernah mengubah apa yang diuji kondisi (lupa i++), atau ada titik koma tepat setelah kondisi: while (count < 10); adalah loop dengan isi kosong yang berputar selamanya. Compiler memberi peringatan untuk kasus kedua dengan CS0642, Possible mistaken empty statement.