Alur Kendali

Percabangan if, perulangan while dan for-in, serta break dan continue.

Daftar isi

Topik ini membahas pernyataan alur kendali pada Carbon, yaitu percabangan if dan else, perulangan while dengan break dan continue, serta perulangan for-in pada tingkat desain. Setiap konstruksi dipraktikkan melalui program yang dijalankan di Carbon Explorer, kecuali for-in yang status dukungannya dijelaskan secara terpisah. Setelah topik ini, program dengan cabang keputusan dan perulangan terkendali dapat ditulis dan diuji di Compiler Explorer.

Percabangan dengan if dan else#

Pernyataan if mengeksekusi blok pernyataan apabila kondisinya bernilai true, dan blok else apabila seluruh kondisi sebelumnya bernilai false. Kondisi ditulis di dalam tanda kurung dan harus bertipe bool, sehingga ekspresi perbandingan seperti nilai >= 85 menjadi isi yang lazim. Kurung kurawal bersifat wajib meskipun bloknya hanya berisi satu pernyataan, sebuah keputusan desain yang mencegah kesalahan penambahan baris yang lazim terjadi pada C++. Rangkaian else if memeriksa kondisi berikutnya hanya apabila seluruh kondisi sebelumnya gagal, dan bentuk ini setara dengan penyusunan if di dalam else tanpa penulisan kurung yang bersarang.

Program berikut menentukan predikat dari sebuah nilai ujian menggunakan rantai else if. Ambang predikat ditulis dari kondisi paling ketat ke paling longgar agar pemeriksaan berhenti pada kategori pertama yang terpenuhi.

carbon percabangan.carbon
package sample api;

fn Main() -> i32 {
  var nilai: i32 = 78;
  if (nilai >= 85) {
    Print("predikat A");
  } else if (nilai >= 70) {
    Print("predikat B");
  } else {
    Print("predikat C");
  }
  return 0;
}
text Keluaran
predikat B
result: 0

Nilai 78 gagal memenuhi nilai >= 85, tetapi memenuhi nilai >= 70, sehingga blok kedua yang dieksekusi dan baris predikat B yang tercetak. Beberapa kondisi juga dapat digabungkan dalam satu ekspresi melalui operator logika, misalnya nilai >= 70 and nilai < 85, sedangkan operator or menggabungkan kondisi dengan syarat cukup salah satunya terpenuhi. Penggabungan semacam ini tetap menghasilkan satu nilai bool yang menjadi kondisi tunggal bagi if.

Perulangan while dengan break#

Pernyataan while mengulang bloknya selama kondisinya bernilai true, dan kondisi diperiksa lebih dahulu sebelum setiap putaran. Apabila kondisi bernilai false pada pemeriksaan pertama, badan perulangan tidak dieksekusi sama sekali. Karena itu, perulangan yang memang dirancang berjalan tanpa batas tertentu lazim ditulis dengan kondisi true dan mengandalkan pernyataan break sebagai satu-satunya cara keluar dari perulangan. Pernyataan break menghentikan perulangan secara langsung, dan eksekusi berlanjut pada pernyataan setelah blok perulangan.

Program berikut mencari bilangan bulat pertama yang kuadratnya melebihi 20. Perulangan berjalan terus sampai kondisi i * i > 20 terpenuhi, lalu break mengakhirinya.

carbon while-berhenti.carbon
package sample api;

fn Main() -> i32 {
  var i: i32 = 1;
  while (true) {
    if (i * i > 20) {
      break;
    }
    i = i + 1;
  }
  Print("kuadrat pertama di atas 20: {0}", i);
  return 0;
}
text Keluaran
kuadrat pertama di atas 20: 5
result: 0

Nilai 4 masih lolos karena 16 belum melebihi 20, sedangkan nilai 5 menghasilkan 25 dan memicu break. Diagram berikut merangkum jalur-jalur eksekusi yang terlibat, mulai dari pemeriksaan kondisi, badan perulangan, lompatan continue kembali ke kondisi, hingga keluar melalui break atau kondisi yang bernilai false.

Kondisi whileBadan perulanganSetelah perulangantruebreakcontinuekondisi false
Alur perulangan while dengan break dan continue

Melewati iterasi dengan continue#

Pernyataan continue memotong sisa badan perulangan pada putaran tersebut dan langsung kembali ke pemeriksaan kondisi. Pernyataan ini berguna untuk melewati kasus yang tidak perlu diolah tanpa mengakhiri perulangannya, misalnya melewati bilangan genap saat menghitung jumlah bilangan ganjil. Program berikut menjumlahkan seluruh bilangan ganjil dari 1 sampai 9 dengan melewati setiap bilangan genap.

carbon while-lanjut.carbon
package sample api;

fn Main() -> i32 {
  var jumlah: i32 = 0;
  var i: i32 = 0;
  while (i < 10) {
    i += 1;
    if (i % 2 == 0) {
      continue;
    }
    jumlah += i;
  }
  Print("jumlah ganjil 1 sampai 9: {0}", jumlah);
  return 0;
}
text Keluaran
jumlah ganjil 1 sampai 9: 25
result: 0

Penambahan i += 1; sengaja diletakkan di awal badan perulangan, sebelum pernyataan continue. Penempatan ini penting karena continue melompat kembali ke kepala perulangan, sehingga pernyataan yang diletakkan setelahnya tidak akan pernah terjangkau pada putaran yang dilewati. Apabila penambahannya berada di akhir badan, nilai i tidak pernah berubah pada putaran yang melewati continue dan perulangan berjalan tanpa henti. Hasil 25 merupakan penjumlahan 1, 3, 5, 7, dan 9, yang dapat dihitung ulang dengan mudah untuk memeriksa program.

Lompatan continue pada while berarti kembali ke pemeriksaan kondisi, sesuai penjelasan dokumen desain perulangan. Sifat ini berbeda dari pernyataan break yang tidak kembali ke kondisi sama sekali, melainkan keluar dari blok perulangan. Karena itu, continue selalu menyisakan satu pemeriksaan kondisi lagi sebelum badan berjalan kembali, dan program tetap berakhir normal selama nilai pencacah bergerak mendekati batas.

for-in antara desain dan interpreter#

Perulangan for-in pada desain Carbon ditulis dengan pola for (pola in ekspresi), dan pola tersebut mengikat satu elemen pada setiap putaran. Elemen terikat secara bawaan sebagai binding nilai yang tidak dapat diubah, dan awalan var pada polanya menjadikannya dapat diubah. Bentuk berikut diambil dari desain tersebut untuk mencetak setiap elemen sebuah kumpulan String.

carbon Contoh: bentuk for-in menurut desain
// tidak-dijalankan
for (nama: String in daftarNama) {
  Print(nama);
}

Status bentuk ini pada interpreter perlu dinyatakan dengan jujur. Prelude bawaan Explorer belum menyediakan tipe rentang seperti Range, sehingga contoh dengan kumpulan bawaan tidak dapat diselesaikan penulisannya, dan penulisan for dengan pola in masih ditolak tahap penguraian. Dengan demikian, potongan di atas tidak disertai keluaran karena memang belum dapat dijalankan pada implementasi mana pun, bukan karena contohnya salah tulis.

Desainnya sendiri sudah tergambar utuh. Perulangan atas tipe yang dibuat pengguna didefinisikan melalui antarmuka perulangan pada library inti, sehingga tipe apa pun yang mengimplementasikan antarmuka itu dapat ditelusuri dengan for-in. Elemen yang terikat pada setiap putaran bersifat sekali baca secara bawaan, dan awalan var pada polanya membuka penulisan ulang di dalam badan. Ketika dukungan rentang pada prelude tersedia, bentuk yang ditulis di atas tinggal dijalankan tanpa perubahan.

Ringkasan#

  • if menuntut kondisi bertipe bool dan kurung kurawal yang wajib, dengan rantai else if yang memeriksa kondisi berikutnya secara berurutan.
  • while memeriksa kondisinya sebelum setiap putaran, break mengakhiri perulangan seketika, dan continue melompat kembali ke pemeriksaan kondisi.
  • Penyusunan while (true) dengan break menjadi pola pencarian yang lazim, sedangkan pernyataan setelah continue pada badan perulangan tidak terjangkau.
  • for-in pada desain mengikat elemen sebagai binding nilai secara bawaan, tetapi belum dapat dijalankan di Explorer karena dukungan rentangnya belum ada.

Referensi#