Percabangan (branching) mengarahkan eksekusi program ke salah satu dari beberapa jalur berdasarkan nilai sebuah kondisi. Topik ini membahas pernyataan If/Then/ElseIf dalam bentuk blok, operator logika AndAlso dan OrElse untuk menyusun kondisi majemuk, serta bentuk satu baris yang ringkas beserta jebakannya. Pembahasan juga mencakup teknik menyusun kondisi beruntun untuk memeriksa rentang nilai. Semua contoh berupa program console yang dijalankan sungguhan sehingga keluarannya dapat direproduksi.
Struktur If/Then/ElseIf#
Pernyataan If/Then/ElseIf mengevaluasi satu kondisi Boolean dan menjalankan blok pernyataan yang sesuai dengan hasilnya. Kondisi pertama diperiksa lebih dahulu. Apabila bernilai True, blok setelah Then dijalankan dan pemeriksaan kondisi lain dilewati. Apabila bernilai False, kondisi pada ElseIf berikutnya diperiksa satu per satu dari atas ke bawah. Blok Else dijalankan apabila seluruh kondisi sebelumnya bernilai False, dan blok ini boleh ditiadakan apabila tidak ada tindakan pengganti yang diperlukan.
Bentuk blok selalu diakhiri End If, sedangkan klausa ElseIf boleh dituliskan sebanyak yang diperlukan dengan satu syarat, yaitu tidak boleh berada setelah Else. Percabangan If juga boleh ditumpuk, sehingga satu blok If dapat berada di dalam blok If lainnya. Susunan berikut mengklasifikasikan sebuah nilai ujian sekaligus menjaga program dari nilai yang berada di luar rentang wajar.
Module PenilaianNilai
Sub Main()
Dim nilai As Integer = 74
Dim keterangan As String
If nilai < 0 OrElse nilai > 100 Then
keterangan = "nilai di luar rentang 0 sampai 100"
ElseIf nilai >= 75 Then
keterangan = "lulus"
ElseIf nilai >= 60 Then
keterangan = "remedial"
Else
keterangan = "tidak lulus"
End If
Console.WriteLine($"Nilai {nilai}: {keterangan}")
End Sub
End ModuleNilai 74: remedialProgram di atas dijalankan dengan pola yang dijelaskan pada topik Program Pertama, yaitu proyek console baru dibuat, isi Program.vb diganti dengan kode program di atas, kemudian dotnet run mengeksekusinya.
# tidak-dijalankan
dotnet new console -lang VB -n PenilaianNilai
cd PenilaianNilai
# ganti isi Program.vb dengan kode program di atas
dotnet runPada contoh tersebut, nilai 74 membuat kondisi pertama bernilai False karena 74 tidak berada di luar rentang 0 sampai 100. Kondisi kedua juga bernilai False karena 74 kurang dari 75. Pemeriksaan berhenti pada kondisi ketiga yang bernilai True, sehingga variabel keterangan terisi “remedial”. Tabel berikut merangkum jalur yang dilalui untuk beberapa nilai lain.
| Nilai | Kondisi yang cocok | Keterangan |
|---|---|---|
| 103 | nilai < 0 OrElse nilai > 100 | nilai di luar rentang 0 sampai 100 |
| 88 | nilai >= 75 | lulus |
| 74 | nilai >= 60 | remedial |
| 45 | klausa Else | tidak lulus |
Operator logika AndAlso dan OrElse#
Kondisi majemuk disusun dengan operator logika AndAlso dan OrElse. Ekspresi a AndAlso b bernilai True hanya apabila kedua sisinya bernilai True, sedangkan a OrElse b bernilai True apabila salah satu sisinya bernilai True. Keduanya menerapkan evaluasi singkat (short-circuit), yaitu sisi kedua tidak dievaluasi apabila sisi pertama sudah menentukan hasil. Sisi kedua AndAlso dilewati apabila sisi pertama bernilai False, dan sisi kedua OrElse dilewati apabila sisi pertama bernilai True.
Sifat evaluasi singkat menjadikan kedua operator ini aman untuk pola penjaga (guard), yaitu pemeriksaan yang memastikan sebuah nilai layak diproses sebelum nilai itu diakses lebih jauh. Program berikut mengakses properti Length dari sebuah variabel yang tidak menunjuk objek apa pun. Akses tersebut tidak pernah dieksekusi karena AndAlso berhenti pada sisi pertama, sehingga program selesai tanpa error NullReferenceException.
Module UjiLogikaSingkat
Sub Main()
Dim nama As String = Nothing
' AndAlso berhenti pada ekspresi pertama yang bernilai False
Dim cekNama As Boolean = nama IsNot Nothing AndAlso nama.Length >= 3
Dim kata As String = "piket"
' OrElse berhenti pada ekspresi pertama yang bernilai True
Dim cekKata As Boolean = kata = "piket" OrElse kata.Length > 10
Console.WriteLine($"cekNama = {cekNama}")
Console.WriteLine($"cekKata = {cekKata}")
End Sub
End ModulecekNama = False
cekKata = TruePasangan And dan Or tidak menerapkan evaluasi singkat, sehingga kedua sisinya selalu dievaluasi meskipun hasilnya sudah pasti. Keduanya juga berfungsi sebagai operator bitwise apabila diterapkan pada bilangan. Untuk kondisi percabangan, AndAlso dan OrElse menjadi pilihan yang lebih tepat karena lebih cepat dan tidak menimbulkan akses yang tidak diperlukan.
Bentuk satu baris If#
If juga tersedia dalam bentuk satu baris yang menuliskan seluruh keputusan pada satu baris tanpa End If. Bentuknya adalah If kondisi Then pernyataan, dan klausa Else boleh ditambahkan pada baris yang sama. Beberapa pernyataan pada sisi Then maupun Else tetap dapat dituliskan, dengan syarat semuanya dipisahkan tanda titik dua dan tetap berada di satu baris. Bentuk ini cocok untuk tindakan tunggal yang pendek.
Perbedaan bentuk blok dan bentuk satu baris ditentukan oleh posisi Then. Apabila ada pernyataan lain setelah Then pada baris yang sama, VB membaca seluruh baris tersebut sebagai If satu baris yang sudah lengkap. Program berikut menggunakan dua If satu baris. Kondisi pertama bernilai False sehingga baris pertama tidak mencetak apa pun, sedangkan kondisi kedua bernilai True dan mencetak sisa kursi.
Module CekRuangan
Sub Main()
Dim kursiKosong As Integer = 4
If kursiKosong = 0 Then Console.WriteLine("Ruangan penuh")
If kursiKosong <= 5 Then Console.WriteLine($"Tersisa {kursiKosong} kursi kosong")
End Sub
End ModuleTersisa 4 kursi kosongDokumentasi resmi menganjurkan bentuk blok untuk keputusan yang mencakup lebih dari satu pernyataan karena bentuk blok lebih mudah dibaca, dipelihara, dan di-debug. Bentuk satu baris paling aman disimpan untuk tindakan tunggal yang benar-benar pendek, misalnya penugasan satu variabel atau satu pemanggilan Console.WriteLine.
If dengan rentang nilai#
Rentang nilai diperiksa dengan membandingkan variabel terhadap batas bawah dan batas atas yang disambung AndAlso, misalnya nilai >= 60 AndAlso nilai <= 74. Pada rantai If/ElseIf, batas atas sering kali dapat ditiadakan karena sebuah kondisi hanya dijangkau apabila kondisi sebelumnya gagal. Pada contoh klasifikasi di atas, kondisi nilai >= 60 hanya diuji setelah kondisi nilai >= 75 bernilai False, sehingga rentangnya secara efektif adalah 60 sampai 74.
Urutan kondisi menentukan hasil. Kondisi yang paling ketat atau paling khusus diletakkan lebih dahulu, sedangkan kondisi yang lebih longgar dituliskan sesudahnya. Bila urutannya dibalik, kondisi longgar menelan seluruh nilai sebelum kondisi ketat sempat diperiksa. Bagian di luar rentang data, yaitu nilai yang tidak valid, dijaga oleh kondisi pertama yang menggunakan OrElse, sehingga nilai 103 dan -5 tidak pernah masuk ke klasifikasi mana pun.
Pilihan pembanding pada batas juga perlu diperiksa ulang setiap kali rantai kondisi berubah. Nilai 75 diperlakukan lulus karena kondisinya menggunakan >=, sedangkan perubahan kecil menjadi > memindahkan nilai 75 ke kelompok remedial tanpa pesan error apa pun. Satu angka yang salah pada pembanding langsung menggeser batas klasifikasi, sehingga batas semacam ini paling aman dituliskan sebagai konstanta yang mudah dicari.
Kesalahan umum#
Kesalahan pada percabangan If biasanya muncul dari kekeliruan membaca bentuk satu baris dan dari cabang yang tidak lengkap. Tiga kesalahan berikut paling sering ditemui beserta penyebab dan perbaikannya.
Pernyataan setelah Then diikuti End If#
Kesalahan ini terjadi apabila blok If ditulis dengan pernyataan menempel pada Then, kemudian diakhiri End If. VB membaca baris pertama sebagai If satu baris yang sudah lengkap, sehingga End If kehilangan pasangannya dan kompilasi gagal dengan error BC30087, yaitu “End If must be preceded by a matching If”. Baris yang berada di antara keduanya dianggap pernyataan biasa di luar percabangan.
' tidak-dijalankan
' Baris pertama terbaca sebagai If satu baris sehingga End If kehilangan pasangan
If nilai >= 75 Then Console.WriteLine("Lulus")
Console.WriteLine("Pertahankan prestasi")
End IfPerbaikannya adalah memindahkan seluruh pernyataan ke baris tersendiri setelah Then sehingga VB membacanya sebagai bentuk blok yang utuh.
ElseIf pada bentuk satu baris#
Klausa ElseIf tidak tersedia pada bentuk satu baris. Kode yang memaksanya gagal dikompilasi dengan error BC30205, yaitu “End of statement expected”, tepat pada posisi kata ElseIf. Untuk pilihan yang lebih dari satu, gunakan bentuk blok dengan ElseIf dan End If, atau susun If satu baris lain di dalam klausa Else baris pertama.
Kelalaian menyertakan Else#
Blok yang menetapkan sebuah variabel perlu memperhitungkan kondisi yang tidak tercakup. Kode berikut hanya menetapkan keterangan apabila nilai minimal 60, sehingga untuk nilai di bawah 60 variabel keterangan tetap berupa string kosong dan keputusan berikutnya menjadi salah.
' tidak-dijalankan
' Tanpa Else, keterangan tetap kosong untuk nilai di bawah 60
Dim keterangan As String = ""
If nilai >= 60 Then
keterangan = "lulus"
End IfMenambahkan Else dengan nilai pengganti, atau menjadikan kondisi terakhir selalu mencakup seluruh sisa kasus, menutup celah ini.
Ringkasan#
- If/Then/ElseIf mengevaluasi kondisi dari atas ke bawah dan menjalankan blok pertama yang bernilai True, sedangkan Else menangkap seluruh sisa kasus.
- AndAlso dan OrElse menerapkan evaluasi singkat sehingga sisi kedua tidak dievaluasi apabila sisi pertama sudah menentukan hasil.
- Bentuk satu baris If cocok untuk tindakan tunggal, tetapi pernyataan setelah Then membuat baris itu terbaca sebagai If satu baris sehingga End If kehilangan pasangan.
- Kondisi untuk rentang nilai disusun berurutan dari yang paling ketat, dan cabang Else atau kondisi penjaga melindungi program dari nilai di luar rentang.
Referensi#
- If…Then…Else Statement — Microsoft Learn — Sintaks bentuk blok dan bentuk satu baris If beserta aturan pembacaan Then.
- AndAlso Operator — Microsoft Learn — Evaluasi singkat pada operator logika AndAlso.
- OrElse Operator — Microsoft Learn — Evaluasi singkat pada operator logika OrElse.