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.
| Operator | Arti | Contoh (suhuRuang=24, suhuTarget=22) |
|---|---|---|
== | sama dengan | suhuRuang == suhuTarget → false |
!= | tidak sama dengan | suhuRuang != suhuTarget → true |
> | lebih besar | suhuRuang > suhuTarget → true |
< | lebih kecil | suhuRuang < suhuTarget → false |
>= | lebih besar atau sama | suhuRuang >= suhuTarget → true |
<= | lebih kecil atau sama | suhuRuang <= suhuTarget → false |
#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:
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 : trueMari kita bedah bagian pentingnya:
- Baris 8 (
std::cout << std::boolalpha;): sejak baris inistd::coutmencetaktrue/falseuntuk nilaibool, alih-alih1/0. Header<iomanip>disertakan untuk manipulator presisi di bagian berikutnya. - Baris 13-18: keenam operator diuji pada
24dan22. Perhatikan>=bernilaitruepadahal kedua nilai berbeda — operator gabungan cukup satu kondisinya yang terpenuhi. - Baris 22 (
bool lebihPanas = suhuRuang > suhuTarget;): hasil perbandingan adalah nilai biasa bertipebool, sehingga sah disimpan ke variabel dan dicetak kembali. - Baris 25-29: perbandingan
hasil == 0.3menghasilkanfalse. Tepat setelahstd::setprecision(17)dipasang, kita melihat alasannya:0.1 + 0.2tersimpan sebagai0.30000000000000004, sedangkan literal0.3tersimpan sebagai0.29999999999999999. Dua bit-nya berbeda, jadi==menolak menyamakan keduanya. - Baris 32-34 (
<=>): operator spaceship membandingkan sekali lalu hasilnya bisa diuji terhadap0, 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.