Operator perbandingan menjawab pertanyaan sederhana — lebih besar, lebih kecil, atau sama — dan selalu menghasilkan nilai bool: true atau false. Ada enam operatornya: ==, !=, <, >, <=, dan >=. Mereka menjadi bahan baku utama kondisi if yang akan kita tulis pada Section Control Flow, sehingga memahami cara kerjanya sekarang sangat berharga. Pada Chapter ini kita menguji keenam operator pada integer, menyimpan hasilnya ke variabel bool, menyelidiki mengapa 0.1 + 0.2 == 0.3 bernilai false, dan mengenal operator spaceship <=> dari C++20.

Enam Operator Perbandingan #

Setiap operator menerima dua operand yang bisa dibandingkan dan menghasilkan bool. Nilai true dicetak sebagai 1 dan false sebagai 0 secara default; agar terbaca sebagai kata, program di bawah memakai manipulator std::boolalpha dari header <iostream> — sebuah pengaturan std::cout yang kita bahas sekilas sekarang dan berguna sepanjang course ini.

OperatorArtiContoh (suhuRuang=24, suhuTarget=22)
==sama dengansuhuRuang == suhuTarget → false
!=tidak sama dengansuhuRuang != suhuTarget → true
>lebih besarsuhuRuang > suhuTarget → true
<lebih kecilsuhuRuang < suhuTarget → false
>=lebih besar atau samasuhuRuang >= suhuTarget → true
<=lebih kecil atau samasuhuRuang <= suhuTarget → false
cpp
#include <compare>
#include <iomanip>
#include <iostream>

int main() {
    int suhuRuang = 24;
    int suhuTarget = 22;

    // boolalpha: cetak true/false alih-alih 1/0
    std::cout << std::boolalpha;
    std::cout << "suhuRuang (" << suhuRuang << ") vs suhuTarget ("
              << suhuTarget << ")\n\n";

    std::cout << "suhuRuang == suhuTarget : " << (suhuRuang == suhuTarget) << "\n";
    std::cout << "suhuRuang != suhuTarget : " << (suhuRuang != suhuTarget) << "\n";
    std::cout << "suhuRuang >  suhuTarget : " << (suhuRuang > suhuTarget) << "\n";
    std::cout << "suhuRuang <  suhuTarget : " << (suhuRuang < suhuTarget) << "\n";
    std::cout << "suhuRuang >= suhuTarget : " << (suhuRuang >= suhuTarget) << "\n";
    std::cout << "suhuRuang <= suhuTarget : " << (suhuRuang <= suhuTarget) << "\n\n";

    // Hasil perbandingan adalah bool: bisa disimpan
    bool lebihPanas = suhuRuang > suhuTarget;
    std::cout << "lebihPanas              : " << lebihPanas << "\n\n";

    // Hati-hati: perbandingan floating-point
    double hasil = 0.1 + 0.2;
    std::cout << std::setprecision(17);
    std::cout << "0.1 + 0.2 (detail)      : " << hasil << "\n";
    std::cout << "0.3      (detail)       : " << 0.3 << "\n";
    std::cout << "hasil == 0.3            : " << (hasil == 0.3) << "\n\n";

    // Spaceship <=>: satu operator, tiga kemungkinan urutan
    int kiri = 5;
    int kanan = 3;
    std::cout << "(5 <=> 3) <  0          : " << ((kiri <=> kanan) < 0) << "\n";
    std::cout << "(5 <=> 3) == 0          : " << ((kiri <=> kanan) == 0) << "\n";
    std::cout << "(5 <=> 3) >  0          : " << ((kiri <=> kanan) > 0) << "\n";

    return 0;
}

Output yang Dihasilkan:

text
suhuRuang (24) vs suhuTarget (22)

suhuRuang == suhuTarget : false
suhuRuang != suhuTarget : true
suhuRuang >  suhuTarget : true
suhuRuang <  suhuTarget : false
suhuRuang >= suhuTarget : true
suhuRuang <= suhuTarget : false

lebihPanas              : true

0.1 + 0.2 (detail)      : 0.30000000000000004
0.3      (detail)       : 0.29999999999999999
hasil == 0.3            : false

(5 <=> 3) <  0          : false
(5 <=> 3) == 0          : false
(5 <=> 3) >  0          : true

Mari kita bedah bagian pentingnya:

  1. Baris 8 (std::cout << std::boolalpha;): sejak baris ini std::cout mencetak true/false untuk nilai bool, alih-alih 1/0. Header <iomanip> disertakan untuk manipulator presisi di bagian berikutnya.
  2. Baris 13-18: keenam operator diuji pada 24 dan 22. Perhatikan >= bernilai true padahal kedua nilai berbeda — operator gabungan cukup satu kondisinya yang terpenuhi.
  3. Baris 22 (bool lebihPanas = suhuRuang > suhuTarget;): hasil perbandingan adalah nilai biasa bertipe bool, sehingga sah disimpan ke variabel dan dicetak kembali.
  4. Baris 25-29: perbandingan hasil == 0.3 menghasilkan false. Tepat setelah std::setprecision(17) dipasang, kita melihat alasannya: 0.1 + 0.2 tersimpan sebagai 0.30000000000000004, sedangkan literal 0.3 tersimpan sebagai 0.29999999999999999. Dua bit-nya berbeda, jadi == menolak menyamakan keduanya.
  5. Baris 32-34 (<=>): operator spaceship membandingkan sekali lalu hasilnya bisa diuji terhadap 0, seperti dibahas di bawah.

Jebakan Perbandingan Floating-Point #

Nilai floating-point disimpan dalam bentuk biner dengan presisi terbatas, sehingga banyak bilangan desimal — termasuk 0.1 dan 0.3 — hanya bisa didekati, bukan disimpan persis. Karena itu perbandingan kesetaraan == pada hasil perhitungan floating-point sering mengecewakan: dua nilai yang tampak sama secara matematis bisa berbeda pada bit terakhir. Pola yang disarankan adalah membandingkan selisih dengan toleransi kecil, misalnya menguji apakah hasil - 0.3 cukup dekat dengan nol.

Topik ini penting dan berlapis — representasi IEEE 754, rounding error, hingga teknik perbandingan aman — sehingga kita bahas tuntas pada Section Pemrograman Numerik, khususnya Chapter Floating-Point Precision dan Rounding Errors. Untuk sekarang, cukup patokan sederhananya: hindari == untuk hasil perhitungan floating-point.

Operator Spaceship <=>: Pratinjau #

C++20 menambahkan operator tiga arah (three-way comparison) yang ditulis <=> dan dijuluki spaceship karena bentuknya. Alih-alih menjawab satu pertanyaan, ia membandingkan dua nilai sekaligus dan menghasilkan kategori urutan: less bila operand kiri lebih kecil, equal bila sama, dan greater bila lebih besar. Kategori tersebut dirancang untuk diperiksa terhadap 0, sehingga (a <=> b) < 0 setara dengan a < b, (a <=> b) == 0 setara dengan a == b, dan (a <=> b) > 0 setara dengan a > b — tiga baris output terakhir pada program di atas menunjukkan persis itu.

Nilai tambah <=> muncul saat kita mendefinisikan tipe sendiri: satu definisi <=> otomatis menyediakan seluruh enam operator perbandingan. Bentuk paling ringkasnya cukup satu kata — auto operator<=>(const Tipe&) const = default; — dan pemakaiannya menunggu Anda pada Chapter berikutnya, Operator Three-Way Comparison, yang memperdalam <=> kustom beserta keluarga ordering-nya.

Pengetahuan tentang bool ini akan langsung terpakai nanti: operator logika &&, ||, dan ! menggabungkan beberapa nilai bool menjadi keputusan yang lebih kompleks, dan itulah topik yang menyusul setelah pembahasan <=> selesai.