Operator unary bekerja pada satu operand. Kotlin menyediakan operator prefix +, -, !, ++, --, serta bentuk postfix ++ dan --. Yang membedakan prefix dan postfix adalah waktu pengembalian nilai: prefix mengembalikan nilai hasil modifikasi, sementara postfix mengembalikan nilai lama sebelum modifikasi. Pada chapter ini kita akan membahas perilaku setiap operator unary, perbedaan prefix dan postfix yang sering membingungkan, dan pola penggunaan ++ pada loop counter.
Daftar Operator Unary #
Berikut ringkasan operator unary Kotlin:
| Operator | Posisi | Function | Contoh | Hasil |
|---|---|---|---|---|
+ | prefix | unaryPlus() | +5 | 5 |
- | prefix | unaryMinus() | -5 | -5 |
! | prefix | not() | !true | false |
++ | prefix | inc() | ++a | a+1 (kembali hasil baru) |
++ | postfix | inc() | a++ | a lama, lalu a naik |
-- | prefix | dec() | --a | a-1 (kembali hasil baru) |
-- | postfix | dec() | a-- | a lama, lalu a turun |
Setiap operator unary dipetakan ke function dengan nama khusus, sehingga tipe buatan kita dapat mendefinisikan perilaku khusus. Misalnya, class BigDecimal di Java mengimplementasikan unaryMinus() sehingga -bigDecimal menghasilkan BigDecimal baru dengan tanda berlawanan.
Prefix vs Postfix #
Perbedaan utama prefix dan postfix terletak pada nilai yang dikembalikan oleh ekspresi. Prefix ++a menambah nilai a terlebih dahulu, lalu mengembalikan nilai baru sebagai hasil ekspresi. Postfix a++ mengembalikan nilai lama sebagai hasil ekspresi terlebih dahulu, baru kemudian menambah a. Keduanya pada akhirnya menaikkan a sebesar satu, tetapi waktu pengembalian berbeda.
fun main() {
var pengunjung = 0
pengunjung++
println("Pengunjung setelah ++ (post): $pengunjung")
pengunjung++
println("Pengunjung setelah ++ (post): $pengunjung")
pengunjung--
println("Pengunjung setelah -- (post): $pengunjung")
var nomor = 5
val naikDulu = ++nomor
println("++nomor -> nomor=$nomor, hasil=$naikDulu")
var nilai = 5
val pakaiDulu = nilai++
println("nilai++ -> nilai=$nilai, hasil=$pakaiDulu")
val positif = 7
val negatif = -positif
val tetapPositif = +positif
println("positif=$positif, negatif=$negatif, tetapPositif=$tetapPositif")
val benar = true
val salah = !benar
println("benar=$benar, !benar=$salah")
var suhu = 0
repeat(3) { suhu++ }
println("Suhu counter setelah repeat 3x: $suhu")
var i = 0
while (i < 3) {
i++
println("Iterasi ke-$i")
}
}Output yang Dihasilkan:
Pengunjung setelah ++ (post): 1
Pengunjung setelah ++ (post): 2
Pengunjung setelah -- (post): 1
++nomor -> nomor=6, hasil=6
nilai++ -> nilai=6, hasil=5
positif=7, negatif=-7, tetapPositif=7
benar=true, !benar=false
Suhu counter setelah repeat 3x: 3
Iterasi ke-1
Iterasi ke-2
Iterasi ke-3Mari kita bedah perbedaan prefix dan postfix pada contoh di atas:
pengunjung++adalah postfix. Variabelpengunjungnaik dari0ke1, tetapi ekspresi mengembalikan nilai lama0. Karena hasil tidak ditangkap, efeknya hanya menambah counter. Pada baris berikutnya,printlnmencetak nilai baru1.++nomoradalah prefix. Variabelnomornaik dari5ke6terlebih dahulu, lalu ekspresi mengembalikan6.val naikDulu = ++nomormenangkap6sebagai hasil. Inilah perbedaan kunci: prefix menjaminnaikDulu == nomor.nilai++adalah postfix. Variabelnilainaik dari5ke6, tetapi ekspresi mengembalikan nilai lama5.val pakaiDulu = nilai++menangkap5. Setelah eksekusi,nilai == 6tetapipakaiDulu == 5.-positifmemanggilunaryMinus(). PadaInt, ini membalik tanda bilangan.+positifmemanggilunaryPlus(), yang padaInttidak mengubah apa pun dan jarang dipakai.!benarmemanggilnot(). PadaBoolean, ini membalik nilai:truemenjadifalse,falsemenjaditrue. Sering dipakai pada kondisiif (!isValid).repeat(3) { suhu++ }menjalankan lambda tiga kali. Setiap iterasi menambahsuhusatu. Hasil akhirsuhu = 3.while (i < 3) { i++; println(...) }adalah pola counter klasik.idimulai dari0, naik tiap iterasi, dan loop berhenti ketikaimencapai3.
Negasi pada Tipe Numerik dan Boolean #
Operator unary - bekerja pada semua tipe numerik (Byte, Short, Int, Long, Float, Double). Untuk tipe bertanda minimal, hasil negasi Int.MIN_VALUE tetap Int.MIN_VALUE karena overflow. Gunakan Long jika rentang nilai mungkin melampaui batas.
Operator ! hanya bekerja pada Boolean. Tidak ada !1 seperti di C. Untuk negasi bitwise pada integer, gunakan function inv() yang membalik setiap bit.
Pola Counter yang Aman #
Hindari menempatkan ++ atau -- di dalam ekspresi kompleks. Sintaks seperti arr[i++] = arr[j++] dapat menyebabkan bug sulit dilacak karena urutan evaluasi samping tidak selalu intuitif. Pisahkan menjadi dua baris bila memungkinkan:
val indeks = i
arr[indeks] = arr[indeks] + 1
i = indeks + 1Referensi Lanjutan #
- Operator overloading
— bagian unary operator (
unaryPlus,unaryMinus,not) pada panduan resmi
Dengan memahami operator unary prefix dan postfix, kita siap berlatih menggunakan rentang nilai dengan operator .., until, downTo, dan step pada chapter berikutnya.