if dan else

Percabangan kondisional, kondisi bersarang, dan bug penugasan di dalam kondisi.

Daftar isi

Percabangan memungkinkan program memilih jalur eksekusi berdasarkan kondisi tertentu. Topik ini membahas pernyataan if, else if, dan else, cara menyusun kondisi bersarang, serta bug penugasan yang menyusup di dalam kondisi. Setiap contoh disertai program yang benar-benar dijalankan, sehingga perilaku percabangan dapat diamati langsung dari keluarannya.

Struktur if, else, dan else if#

Pernyataan if mengeksekusi blok kode tertentu apabila kondisinya bernilai true. Kondisi pada C# wajib bertipe bool, yaitu tipe yang hanya memiliki dua nilai, true dan false. Apabila kondisi bernilai false, eksekusi beralih ke else if berikutnya, dan apabila seluruh kondisi tidak terpenuhi, blok else dijalankan sebagai pilihan terakhir. Rangkaian if, else if, dan else dievaluasi dari atas ke bawah, sehingga blok pertama yang kondisinya terpenuhi menjadi satu-satunya yang dieksekusi. Setelah blok terpilih selesai dijalankan, program berlanjut ke pernyataan sesudah rangkaian percabangan.

Program berikut mengklasifikasikan nilai ujian menjadi predikat dan status kelulusan melalui dua rangkaian percabangan. Rangkaian pertama menentukan predikat, sedangkan rangkaian kedua memeriksa syarat kehadiran sebelum menentukan status.

csharp Program.cs
// Program klasifikasi status belajar dengan if, else if, dan else
int nilai = 78;

if (nilai >= 85)
{
    Console.WriteLine("Predikat: sangat baik");
}
else if (nilai >= 70)
{
    Console.WriteLine("Predikat: baik");
}
else
{
    Console.WriteLine("Predikat: perlu latihan tambahan");
}

// kondisi bersarang: syarat kehadiran diperiksa lebih dahulu
int kehadiran = 88;

if (kehadiran >= 75)
{
    if (nilai >= 70)
    {
        Console.WriteLine("Status: lulus");
    }
    else
    {
        Console.WriteLine("Status: mengulang ujian");
    }
}
else
{
    Console.WriteLine("Status: tidak memenuhi syarat ujian");
}
text Keluaran
Predikat: baik
Status: lulus

Nilai 78 tidak memenuhi syarat predikat sangat baik, tetapi memenuhi syarat baik, sehingga blok else if yang dieksekusi. Pada rangkaian kedua, kehadiran 88 melewati syarat minimal 75, kemudian kondisi bersarang di dalamnya memeriksa nilai ujian. Urutan penulisan kondisi menentukan hasil, karena syarat yang lebih ketat harus diperiksa lebih dahulu. Apabila syarat 70 ditulis di atas syarat 85, nilai 90 akan tertangkap oleh cabang yang salah dan tidak pernah sampai ke predikat sangat baik.

Kondisi pada contoh ditulis sebagai perbandingan seperti nilai >= 70, dan hasil perbandingan itulah yang bertipe bool. Operator perbandingan yang tersedia meliputi ==, !=, <, <=, >, dan >=, sehingga kondisi if selalu berupa pertanyaan yang jawabannya benar atau salah. Bagian else bersifat opsional, dan pernyataan if tanpa else cukup untuk kasus yang tidak memiliki jalur alternatif. Blok else if juga boleh dirangkai lebih dari dua kali sesuai banyaknya tingkatan yang dibutuhkan.

Untuk menjalankan program tersebut dari folder topik, gunakan perintah berikut.

bash
# aktifkan .NET yang terpasang di sandbox
export DOTNET_ROOT=/home/kal/.dotnet PATH=/home/kal/.dotnet:$PATH DOTNET_CLI_TELEMETRY_OPTOUT=1 DOTNET_NOLOGO=1
# jalankan program contoh dari folder topik
dotnet run --file Program.cs
text Keluaran
Predikat: baik
Status: lulus

Kondisi bersarang#

Kondisi bersarang adalah percabangan yang ditempatkan di dalam blok percabangan lainnya. Struktur ini dipakai apabila pemeriksaan tahap kedua hanya relevan untuk satu cabang tertentu. Pada program sebelumnya, pemeriksaan nilai ujian hanya dilakukan setelah syarat kehadiran terpenuhi, sehingga kedua kondisi membentuk alur dua tahap dan bukan sekadar dua syarat sejajar. Bersarang yang terlalu dalam membuat kode sulit diikuti karena setiap tingkat menambah satu lekukan (indentation) baru.

Apabila kedua syarat memang berdiri setara, menggabungkannya dengan operator logika menghasilkan struktur yang lebih rata.

csharp Contoh: kondisi bersarang yang diratakan dengan operator &&
// Contoh: dua syarat digabungkan agar struktur percabangan tetap rata
int nilai = 78;
int kehadiran = 88;

if (kehadiran >= 75 && nilai >= 70)
{
    Console.WriteLine("Status: lulus");
}
else
{
    Console.WriteLine("Status: tidak memenuhi syarat");
}
text Keluaran
Status: lulus

Operator && hanya mengembalikan true apabila kedua sisinya bernilai true, dan sisi kanannya tidak dievaluasi apabila sisi kiri sudah bernilai false. Sifat ini disebut evaluasi singkat, dan urutan sisi kiri terlebih dahulu menjadikan pemeriksaan murah ditempatkan di sebelah kiri. Pemilihan antara bersarang dan penggabungan mengikuti makna logikanya. Gunakan struktur bersarang apabila memang ada pemeriksaan bertahap yang alurnya berurutan, dan gunakan operator && atau || apabila syarat-syaratnya setara sehingga dapat digabungkan dalam satu kondisi.

Sebagai patokan praktis, kedalaman bersarang yang masih nyaman dibaca sekitar dua tingkat. Apabila kebutuhan pemeriksaan bertambah, deklarasikan variabel bool dengan nama yang menjelaskan syaratnya, misalnya memenuhiSyaratUjian, lalu gunakan variabel tersebut sebagai kondisi. Nama yang deskriptif menyimpan makna pemeriksaan di satu tempat, sehingga rangkaian percabangan utama tetap singkat.

Bug penugasan di dalam kondisi#

Bug penugasan muncul ketika operator penugasan = tertulis pada tempat yang seharusnya diisi operator perbandingan ==. C# menutup sebagian besar celah ini sejak tahap kompilasi, karena kondisi if wajib bertipe bool. Penugasan yang menghasilkan int ditolak oleh kompilator (compiler), yaitu program yang menerjemahkan kode sumber menjadi program yang dapat dieksekusi.

csharp Contoh: penugasan int di dalam kondisi yang ditolak kompilator
// tidak-dijalankan
// Contoh: penugasan int di dalam kondisi menghasilkan error CS0029
int skor = 90;

if (skor = 100)
{
    Console.WriteLine("sempurna");
}

Kompilator melaporkan error CS0029 karena hasil skor = 100 bertipe int, sedangkan kondisi menuntut bool. Perlindungan ini menghilangkan bug klasik bahasa C, yang menafsirkan penugasan di dalam kondisi sebagai nilai kebenaran. Perlindungan tersebut berlubang satu, yaitu pada penugasan antarvariabel bool, karena hasil penugasannya memang bertipe bool dan sah secara sintaks.

csharp Contoh: bug penugasan pada variabel bool
// Contoh: bug penugasan pada kondisi bertipe bool
bool terkirim = false;
int antreanTersisa = 3;

// maksudnya pemeriksaan antrean, tetapi yang tertulis adalah penugasan
if (terkirim = antreanTersisa == 0)
{
    Console.WriteLine("Semua pesan terkirim");
}
else
{
    Console.WriteLine("Masih ada antrean");
}

Console.WriteLine($"Nilai terkirim berubah menjadi {terkirim}");
text Keluaran
Masih ada antrean
Nilai terkirim berubah menjadi False

Program tersebut menunjukkan dua akibat sekaligus. Cabang else dijalankan karena kondisi bernilai false, dan variabel terkirim ikut berubah sebagai efek samping penugasan. Perbaikannya menggunakan operator perbandingan, yaitu menulis antreanTersisa == 0 tanpa penugasan, atau menggunakan == secara eksplisit apabila perbandingan antarvariabel memang dimaksudkan.

Kesalahan umum#

  • Menempatkan titik koma setelah kondisi, misalnya if (nilai >= 70);. Tanda titik koma itu menjadi pernyataan kosong yang dianggap sebagai badan if, sehingga blok kurung kurawal di bawahnya selalu dijalankan dan percabangan tidak bekerja sama sekali.
  • Mengurutkan kondisi dari yang paling umum ke yang paling khusus. Rangkaian else if berhenti pada kondisi pertama yang terpenuhi, sehingga syarat yang lebih sempit harus ditulis lebih dahulu.
  • Mengabaikan kurung kurawal pada badan if yang memuat lebih dari satu pernyataan. Tanpa kurung kurawal, hanya pernyataan pertama yang termasuk badan if, sedangkan pernyataan berikutnya selalu dieksekusi apa pun hasil kondisinya.

Ringkasan#

  • Pernyataan if mengeksekusi blok kode apabila kondisi bertipe bool bernilai true, dan rangkaian else if serta else menyediakan jalur alternatif yang dievaluasi dari atas ke bawah.
  • Kondisi bersarang menyatakan pemeriksaan bertahap, sedangkan operator && dan || menggabungkan syarat-syarat yang berdiri setara.
  • Penugasan = di dalam kondisi bertipe int ditolak kompilator, tetapi penugasan pada variabel bool lolos tanpa peringatan dan mengubah nilai variabelnya, sehingga perbandingan selalu ditulis dengan ==.

Referensi#