Kondisi nyata jarang berdiri sendiri: “suhu melebihi 38 dan pasien lelah”, “stok habis atau pesanan mendesak”, “tidak termasuk kategori diskon”. Operator logika menggabungkan beberapa kondisi menjadi satu keputusan. MATLAB menyediakan dua keluarga: operator elemen (&, |, ~, xor) untuk array, dan operator short-circuit (&&, ||) yang khusus untuk scalar. Memahami kapan memakai yang mana — dan mengapa urutan evaluasi penting — adalah fokus Chapter ini.

Operator Logika Elemen-per-Elemen #

Empat operator berikut bekerja pada array logical (atau angka yang otomatis dikonversi) elemen-per-elemen, sama seperti operator pembanding:

OperatorOperasiHasil true bila
&ANDkedua operand true
|ORminimal satu operand true
~NOT (negasi)operand false (operator unary)
xor()exclusive ORtepat salah satu operand true

Operator ~ ditulis sebelum operand; tiga sisanya diletakkan di antara dua operand. Perhatikan contoh pemantauan pasien berikut — kita menggabungkan mask demam dengan data kelelahan:

matlab
suhu = [36.5 38.9 37.1 39.4];
kelelahan = [false true false true];
demam = suhu > 38;

fprintf('demam             : %d %d %d %d\n', demam);
fprintf('demam & kelelahan : %d %d %d %d\n', demam & kelelahan);
fprintf('demam | kelelahan : %d %d %d %d\n', demam | kelelahan);
fprintf('~demam            : %d %d %d %d\n', ~demam);
fprintf('xor(demam, lelah) : %d %d %d %d\n', xor(demam, kelelahan));

Output yang Dihasilkan:

text
demam             : 0 1 0 1
demam & kelelahan : 0 1 0 1
demam | kelelahan : 0 1 0 1
~demam            : 1 0 1 0
xor(demam, lelah) : 0 0 0 0

Mari kita bedah baris-baris kode di atas:

  1. Baris 3 (demam = suhu > 38): perbandingan menghasilkan mask logical; pasien ke-2 dan ke-4 demam.
  2. Baris 6 (demam & kelelahan): hanya pasien yang demam dan lelah yang bernilai 1 — pasien 2 dan 4 lolos kedua kondisi.
  3. Baris 7 (demam | kelelahan): pasien yang demam atau lelah; hasil kebetulan sama karena kedua mask identik polanya.
  4. Baris 8 (~demam): negasi membalik setiap elemen mask.
  5. Baris 9 (xor(...)): xor menghasilkan 1 hanya bila kedua mask berbeda; karena demam dan kelelahan berpola sama, seluruh hasilnya 0.

Hasil &, |, ~, dan xor tetap berupa array logical berukuran sama dengan operand — siap dipakai sebagai mask atau diringkas menjadi satu keputusan.

all dan any: Meringkas Array Menjadi Satu Keputusan #

Dua fungsi bawaan menjembatani array logical dan kondisi scalar. Fungsi any() menghasilkan true bila minimal satu elemen true; fungsi all() menghasilkan true hanya bila seluruh elemen true:

matlab
fprintf('any(demam) : %d\n', any(demam));
fprintf('all(demam) : %d\n', all(demam));

Output yang Dihasilkan:

text
any(demam) : 1
all(demam) : 0

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (any(demam)): dua pasien demam, jadi “ada yang demam” bernilai true (1).
  2. Baris 2 (all(demam)): pasien 1 dan 3 tidak demam, jadi “semua demam” bernilai false (0).

Pola any(mask) dan all(mask) adalah cara idiomatik MATLAB untuk mengubah “kondisi per elemen” menjadi “kondisi keseluruhan” — misalnya if any(suhu > 38) untuk memicu peringatan.

Short-Circuit: && dan || #

Operator && dan || hanya bekerja pada scalar — dan di situ letak keunggulannya: MATLAB mengevaluasi operand pertama lebih dulu, lalu berhenti lebih awal (short-circuit) bila hasil akhir sudah pasti. Jika operand kiri && bernilai false, operand kanan tidak dievaluasi sama sekali; jika operand kiri || bernilai true, operand kanan juga dilewati.

Perilaku ini menjadi penyelamat saat operand kanan berisiko galat:

matlab
pembagi = 0;
if (pembagi ~= 0) && (10 / pembagi > 2)
  fprintf('Hasil pembagian besar\n');
else
  fprintf('Guard bekerja: pembagi nol dihindari\n');
end

Output yang Dihasilkan:

text
Guard bekerja: pembagi nol dihindari

Mari kita bedah baris-baris kode di atas:

  1. Baris 2 ((pembagi ~= 0) && ...): operand kiri bernilai false karena pembagi memang 0.
  2. Evaluasi berhenti: MATLAB tidak mengevaluasi 10 / pembagi > 2, sehingga tidak ada pembagian dengan nol yang terjadi. Operasi ini berjalan tanpa galat.
  3. Baris 5 (else): karena kondisi utama false, blok else yang dijalankan.

Tanpa short-circuit (misalnya memakai &), ekspresi 10 / pembagi akan dievaluasi duluan dan memicu peringatan “divide by zero” — pada MATLAB, pembagian skalar dengan nol menghasilkan Inf, tetapi banyak operasi lain (akses elemen, pemanggilan fungsi) langsung galat. Pola (kondisi aman) && (operasi berisiko) disebut guard clause dan wajib menjadi kebiasaan kita.

matlab
batas = 37.5;
fprintf('suhu(1) > batas && suhu(2) > batas : %d\n', ...
        suhu(1) > batas && suhu(2) > batas);

Output yang Dihasilkan:

text
suhu(1) > batas && suhu(2) > batas : 0

Contoh terakhir membandingkan dua elemen suhu terhadap batas; kedua operand berupa logical scalar sehingga && sah digunakan — hasil 0 karena suhu(2) (38.9) melebihi batas tetapi suhu(1) (36.5) tidak.

Prioritas Logika di Balik Layar #

Urutan kekuatan operator logika dari yang tertinggi: ~, lalu &, lalu |, lalu && dan || (terlemah). Akibatnya, ekspresi a | b & c dievaluasi sebagai a | (b & c) — MATLAB selalu memberi & prioritas di atas |, bahkan ketika & muncul belakangan. Perbandingan (==, <, dst.) mengikat lebih kuat daripada seluruh operator logika, jadi suhu > 38 & kelelahan berarti (suhu > 38) & kelelahan tanpa kurung tambahan.

Berkas contoh.m pada bagian bawah halaman menguji keempat operator elemen, all/any, dan guard clause short-circuit dalam satu script utuh.

Ringkasan #

Operator &, |, ~, dan xor menggabungkan kondisi elemen-per-elemen; all() dan any() meringkas array menjadi satu keputusan. Operator short-circuit && dan || terbatas pada scalar tetapi menghentikan evaluasi lebih awal — kunci pola guard clause yang mencegah galat. Prioritas ~ > & > | menjelaskan urutan evaluasi, dan kurung eksplisit tetap sahabat terbaik kode yang terbaca.