Loop while adalah bentuk perulangan paling fundamental di C. Saat menulis program, kita sering perlu mengulang sebuah blok kode selama kondisi tertentu masih terpenuhi—misalnya terus membaca data dari pengguna selama input masih valid, terus memproses pesanan selama antrian belum kosong, atau terus mengurangi saldo selama nilainya masih positif. Statement while menyediakan pola “cek dulu, baru eksekusi”: program mengevaluasi kondisi di bagian atas loop, dan jika hasil evaluasi true (bukan nol), body loop dieksekusi. Karena pengecekan terjadi di awal, body loop mungkin sama sekali tidak dieksekusi jika sejak awal kondisi sudah false. Pada chapter ini kita akan menelaah sintaks dasar while, cara kerja di balik layar, serta jebakan umum yang sering menjebak pemula.

Sintaks Dasar while #

Bentuk umum while di C adalah sebagai berikut:

c
while (ekspresi) {
    /* body loop */
}

Compiler mengevaluasi ekspresi di dalam tanda kurung. Jika hasil evaluasi tidak sama dengan 0, body loop dieksekusi satu kali. Setelah body selesai, kontrol kembali ke bagian atas dan ekspresi dievaluasi ulang. Siklus ini berulang sampai ekspresi menghasilkan 0—saat itu loop berhenti dan eksekusi berlanjut ke statement setelah tanda kurung kurawal tutup. Berdasarkan ISO/IEC 9899 §6.8.5.1, evaluasi ekspresi dan eksekusi body terjadi bergantian, dengan evaluasi kondisi selalu mendahului eksekusi body pada setiap iterasi.

Visualisasi Konsep #

Diagram berikut memperlihatkan alur while dengan pengecekan kondisi di awal setiap iterasi:

Pada diagram di atas, alur while selalu mengevaluasi kondisi sebelum mengeksekusi body. Bila kondisi awal sudah false, body tidak pernah dieksekusi sama sekali—perilaku yang membedakan while dari do-while. Setelah body selesai, kontrol kembali ke atas untuk evaluasi ulang kondisi. Siklus ini berulang sampai kondisi menjadi false, dan pada saat itu loop berhenti serta eksekusi melanjut ke statement setelah }. Karena pengecekan terjadi di awal, body loop wajib mengandung setidaknya satu statement yang mengubah nilai kondisi; bila tidak, loop berjalan tanpa henti (infinite loop).

c
#include <stdio.h>

int main(void) {
    int i = 1;

    while (i <= 5) {
        printf("Iterasi ke-%d\n", i);
        i = i + 1;
    }

    printf("Selesai\n");
    return 0;
}

Output yang Dihasilkan:

text
Iterasi ke-1
Iterasi ke-2
Iterasi ke-3
Iterasi ke-4
Iterasi ke-5
Selesai

Mari kita telaah baris-baris kode di atas:

  1. Baris 4 (int i = 1;): variabel i dideklarasikan dan diisi 1 sebagai counter awal loop.
  2. Baris 6 (while (i <= 5)): compiler mengevaluasi i <= 5. Karena 1 <= 5 adalah true (hasil 1), body loop dieksekusi.
  3. Baris 7 (printf(...)): mencetak pesan dengan nilai i saat ini.
  4. Baris 8 (i = i + 1;): menambah i sebesar satu. Tanpa baris ini, kondisi i <= 5 tidak akan pernah menjadi false dan loop berjalan tanpa henti.
  5. Baris 10 (printf("Selesai\n");): dieksekusi setelah loop selesai, yaitu ketika i sudah bernilai 6 dan kondisi i <= 5 menjadi false.

while dengan Kondisi Berubah dari Iterasi ke Iterasi #

Kondisi while tidak harus berupa perbandingan counter. Selama nilai ekspresi dapat menjadi false pada suatu titik, bentuk kondisi apapun diperbolehkan. Berikut contoh simulasi penarikan saldo harian:

c
#include <stdio.h>

int main(void) {
    int saldo = 1000;
    int hari = 0;

    while (saldo > 0) {
        saldo = saldo - 250;
        hari = hari + 1;
        printf("Hari %d: tarik 250, sisa %d\n", hari, saldo);
    }

    printf("Saldo habis setelah %d hari\n", hari);
    return 0;
}

Output yang Dihasilkan:

text
Hari 1: tarik 250, sisa 750
Hari 2: tarik 250, sisa 500
Hari 3: tarik 250, sisa 250
Hari 4: tarik 250, sisa 0
Saldo habis setelah 4 hari

Loop terus berjalan selama saldo > 0 bernilai true. Setelah empat kali pengurangan 250, saldo menjadi 0, sehingga evaluasi 0 > 0 menghasilkan 0 (false), dan loop berhenti. Perhatikan bahwa body loop tetap dieksekusi pada iterasi ketika saldo bernilai 250—250 > 0 masih true di awal iterasi tersebut.

Akumulasi Nilai Sampai Batas Terpenuhi #

Salah satu pola umum while adalah mengakumulasi nilai sampai total mencapai ambang batas. Loop berhenti ketika kondisi ambang terpenuhi, bukan ketika counter mencapai angka tertentu:

c
#include <stdio.h>

int main(void) {
    int total = 0;
    int n = 1;

    /* Jumlahkan bilangan asli sampai total mencapai minimal 50 */
    while (total < 50) {
        total = total + n;
        printf("Tambah %d -> total = %d\n", n, total);
        n = n + 1;
    }

    printf("Berhenti di n = %d, total = %d\n", n, total);
    return 0;
}

Output yang Dihasilkan:

text
Tambah 1 -> total = 1
Tambah 2 -> total = 3
Tambah 3 -> total = 6
Tambah 4 -> total = 10
Tambah 5 -> total = 15
Tambah 6 -> total = 21
Tambah 7 -> total = 28
Tambah 8 -> total = 36
Tambah 9 -> total = 45
Tambah 10 -> total = 55
Berhenti di n = 11, total = 55

Loop terus menambahkan n ke total selama total < 50 masih true. Pada iterasi terakhir, total menjadi 55—melebihi ambang 50—sehingga evaluasi berikutnya 55 < 50 menghasilkan 0 dan loop berhenti. Variabel n akhirnya bernilai 11 karena increment terjadi sebelum loop mengevaluasi ulang kondisi.

Loop yang Tidak Pernah Dieksekusi #

Karena while mengevaluasi kondisi sebelum mengeksekusi body, ada kalanya body tidak dieksekusi sama sekali. Hal ini terjadi ketika kondisi awal sudah false:

c
#include <stdio.h>

int main(void) {
    int jumlah = 10;

    while (jumlah > 100) {
        printf("Baris ini tidak pernah dicetak\n");
        jumlah = jumlah + 1;
    }

    printf("jumlah akhir: %d\n", jumlah);
    return 0;
}

Output yang Dihasilkan:

text
jumlah akhir: 10

Pada contoh di atas, jumlah > 100 dievaluasi sebagai 10 > 100 → 0 (false) sejak iterasi pertama. Body loop sama sekali tidak dieksekusi, dan program langsung melompat ke statement printf setelah loop. Karakteristik ini membedakan while dari do-while yang akan kita pelajari pada chapter berikutnya.