for menyatukan inisialisasi, kondisi, dan langkah dalam satu header — pas untuk pengulangan yang hitungannya sudah jelas. Tetapi banyak tugas yang jumlah putarannya tidak bisa kita tentukan di muka: berapa banyak angka yang akan diketik pengguna? Kapan data di file berakhir? Untuk kasus seperti ini, while memberi bentuk yang lebih jujur: “ulangi SELAMA kondisi ini benar”. Pada Chapter ini kita mempelajari cara kerja while sebagai pre-test loop, mengenal pola input sentinel yang menjadi inti dari banyak program command-line, dan merumuskan kriteria memilih antara for dan while.

Bentuk Dasar: Uji Dulu, Jalankan Kemudian #

while hanya punya satu klausa: kondisi. Sebelum setiap putaran, kondisi dievaluasi; bila true, badan dijalankan lalu evaluasi diulang; bila false, eksekusi melompat ke baris sesudah loop. Karena pemeriksaan terjadi SEBELUM badan, loop ini disebut pre-test loop — bila kondisi sejak awal false, badan tidak pernah dijalankan sama sekali. Program hitung mundur berikut memperlihatkan mekanismenya:

cpp
#include <iostream>

int main() {
    int hitungan = 3;

    while (hitungan > 0) {
        std::cout << hitungan << "\n";
        --hitungan;
    }

    std::cout << "Mulai!\n";
    return 0;
}

Output yang Dihasilkan:

text
3
2
1
Mulai!

Mari kita telusuri putarannya:

  1. Baris 5 (int hitungan = 3;): variabel kondisi disiapkan sebelum loop — padanan klausa init pada for.
  2. Baris 7 (while (hitungan > 0)): putaran pertama menemukan 3 > 0 benar, jadi badan masuk. Ini juga tempat putaran terakhir diuji: setelah --hitungan menjadikan nilainya 0, kondisi gagal dan loop berhenti.
  3. Baris 9 (--hitungan;): baris yang menggerakkan loop mendekati berakhir. Tanpa baris ini, hitungan tetap 3 selamanya dan program tidak pernah selesai — versi infinite loop dari while.
  4. Baris 12: karena kondisi sudah false, baris ini tercapai tepat satu kali, sesudah loop berakhir.

Perhatikan pembagian kerjanya: inisialisasi berada SEBELUM loop, pemeriksaan di header, dan penggerak di dalam badan. while memang lebih longgar strukturnya daripada for; kebebasan itu nyaman, tetapi juga lebih mudah membuat kita lupa menggerakkan loop. Sintaks lengkapnya tersaji di cppreference .

Kapan while Lebih Tepat dari for #

Keduanya bisa saling menggantikan secara teknis — setiap for bisa ditulis ulang sebagai while. Perbedaannya ada pada kejelasan maksud. Gunakan for bila ada counter yang naik-turun dengan pola tetap; gunakan while bila kondisi berakhirnya bergantung pada peristiwa yang tidak bisa dihitung di muka: pengguna mengetik sesuatu, nilai mencapai toleransi tertentu, atau sumber data berakhir. Aturan sederhananya: bila klausa iterasi Anda bukan sekadar ++i melainkan “tunggu peristiwa berikutnya”, while lebih tepat.

Pola Input Sentinel dengan cin #

Pola paling terkenal dari while adalah sentinel: pengguna menyuntikkan data satu per satu, dan sebuah nilai khusus — sentinel — menjadi tanda “selesai”. Nilai -1 lazim dipilih untuk data yang semestinya positif, karena -1 mustahil merupakan data sah. Program berikut menjumlahkan deretan nilai sampai pengguna mengetik -1:

cpp
#include <iostream>

int main() {
    int nilai;
    int total = 0;
    int banyak = 0;

    std::cout << "Masukkan nilai (akhiri dengan -1): ";
    std::cin >> nilai;

    while (nilai != -1) {
        total += nilai;
        ++banyak;
        std::cin >> nilai;
    }

    std::cout << "Total: " << total << "\n";
    std::cout << "Rata-rata: " << total / banyak << "\n";
    return 0;
}

Output yang Dihasilkan:

text
Masukkan nilai (akhiri dengan -1): Total: 240
Rata-rata: 80

Mari kita bedah pola sentinelnya baris demi baris:

  1. Baris 9 (std::cin >> nilai;): pembacaan PERTAMA dilakukan SEBELUM loop. Ini khas pola sentinel — kondisi loop butuh nilai yang sudah terisi, jadi kita mengambil data perdana di luar.
  2. Baris 11 (while (nilai != -1)): kondisi memeriksa data yang BARU saja dibaca. Bila pengguna langsung mengetik -1, badan tidak pernah berjalan dan program tetap aman (meski pembagian di akhir akan bermasalah — kasus tepi yang kita tangani nanti pada pembahsan validasi).
  3. Baris 12-13: data sah diproses: ditambahkan ke total dan dihitung dalam banyak.
  4. Baris 14 (std::cin >> nilai;): pembacaan BERIKUTNYA di akhir badan — padanan klausa iterasi pada for. Perhatikan bahwa prompt tidak dicetak ulang di dalam loop, sehingga output program tampak satu baris prompt saja.
  5. Baris 17-18: sesudah loop, total berisi 80 + 90 + 70 = 240 dan banyak berisi 3, sehingga rata-rata tercetak 80. Operator / pada dua int menghasilkan bilangan bulat — pembagian pecahan dibahas pada Chapter Operator Aritmetika.

Pola ini sering kita temui di program nyata: shell membaca perintah sampai Anda mengetik exit, program pembacaan file membaca baris sampai akhir file. Sentinel -1 bekerja untuk angka; bila data bisa berupa angka apa pun termasuk negatif, sentinel harus diganti (misalnya nilai yang dijamin di luar rentang data), atau gunakan penanda akhir stream seperti std::cin >> x yang diuji keberhasilannya — teknik yang kita sentuh pada Chapter Input dengan cin dan kita perdalam di Section Input-Output dan File.

Dengan while, program kita kini bisa mengulang pekerjaan yang panjangnya tak terduga. Namun ada satu kasus yang membebani pola sentinel di atas: membaca data SEKALI pasti perlu dilakukan, apa pun kondisinya. Untuk “lakukan dulu, baru uji” seperti itu, C++ menyediakan do-while — topik Chapter berikutnya.