Sejauh ini kita memakai operator biner yang selalu menerima dua operand. Java juga mengenal operator unary — operator yang hanya butuh satu operand — dan Anda sudah memakainya sejak lama: tanda minus pada -10 adalah operator unary negasi. Kelompok ini beranggotakan + (identitas), - (negasi), ++ (increment), -- (decrement), dan ~ (komplemen bit); operator ! untuk boolean kita bahas pada Chapter Logical Operators. Bintang utama Chapter ini adalah pasangan ++ dan -- yang memiliki dua bentuk — prefix dan postfix — dengan perbedaan perilaku yang menjadi salah satu pertanyaan wawancara kerja paling klasik.

Operator Plus Minus dan Komplemen #

Operator unary - membalik tanda nilai numeriknya, sehingga -suhuRuang pada variabel bernilai 24 menghasilkan -24 dan dua kali negasi saling meniadakan: -titikBeku pada -10 menghasilkan 10. Operator unary + hampir tidak pernah dibutuhkan karena nilainya identik dengan operand asal; kegunaannya sekadar menyatakan niat secara eksplisit, misalnya +suhu untuk menandakan “nilai positif”. Operator ~ kita kenal pada Chapter Bitwise Operators sebagai pembalik seluruh bit — rumus praktisnya ~n sama dengan -n - 1.

public class OperatorUnary {
    public static void main(String[] args) {
        int suhuRuang = 24;
        int titikBeku = -10;

        System.out.println("+suhuRuang = " + (+suhuRuang));
        System.out.println("-suhuRuang = " + (-suhuRuang));
        System.out.println("-titikBeku = " + (-titikBeku));
        System.out.println("~suhuRuang = " + (~suhuRuang) + " (komplemen bit)");
    }
}

Output yang Dihasilkan:

text
+suhuRuang = 24
-suhuRuang = -24
-titikBeku = 10
~suhuRuang = -25 (komplemen bit)

Baris 6-7 memperlihatkan identitas + dan negasi - bekerja pada nilai positif. Baris 8 membuktikan negasi ganda: -(-10) kembali menjadi 10. Baris 9 menghasilkan -25 dari ~24 sesuai rumus -24 - 1 — bukan kebetulan, melainkan akibat langsung representasi two’s complement.

Increment dan Decrement #

Operator ++ menaikkan variabel sebesar satu dan operator -- menurunkannya sebesar satu. Keduanya hadir dalam dua bentuk yang letak penulisannya berbeda: prefix (++a) menaikkan nilai lebih dahulu lalu nilai baru itulah yang dipakai ekspresi, sedangkan postfix (a++) menyerahkan nilai lama lebih dahulu kepada ekspresi, baru variabel dinaikkan. Ketika a++ atau ++a berdiri sebagai statement mandiri, keduanya identik — perbedaannya baru terasa ketika hasilnya dipakai dalam ekspresi yang lebih besar.

java NaikTurun.java
public class NaikTurun {
    public static void main(String[] args) {
        int a = 5;
        System.out.println("a   = " + a);
        System.out.println("a++ = " + (a++));   // nilai lama dipakai dulu, lalu a naik
        System.out.println("a   = " + a);
        System.out.println("++a = " + (++a));   // a naik dulu, lalu nilai barunya dipakai

        int b = 10;
        System.out.println("b-- = " + (b--));
        System.out.println("b   = " + b);
        System.out.println("--b = " + (--b));
    }
}

Output yang Dihasilkan:

text
a   = 5
a++ = 5
a   = 6
++a = 7
b-- = 10
b   = 9
--b = 8

Mari kita telaah baris-baris kode di atas:

  1. Baris 5 (System.out.println("a++ = " + (a++));): variabel a bernilai 5; postfix menyerahkan nilai lama 5 kepada println, dan hanya setelah itu a menjadi 6 — terbukti pada baris 6.
  2. Baris 7 (System.out.println("++a = " + (++a));): prefix menaikkan a dari 6 menjadi 7 lebih dahulu, lalu nilai baru 7 itulah yang dicetak.
  3. Baris 10-12: pola yang sama untuk decrement — b-- mencetak 10 sementara b diam-diam menjadi 9, lalu --b menurunkan b menjadi 8 sebelum dicetak.

Increment di Dalam Ekspresi Majemuk #

Perbedaan prefix dan postfix paling terlihat ketika keduanya berada dalam satu ekspresi. Ekspresi legendaris x++ + ++x dievaluasi dari kiri ke kanan: x++ menyerahkan nilai 5 (dengan x naik menjadi 6), kemudian ++x menaikkan x menjadi 7 dan menyerahkan 7, sehingga jumlahnya 12 dan x berakhir di 7. Mari kita buktikan bersama JVM, bukan sekadar menghafal.

public class EkspresiGabunganIncrement {
    public static void main(String[] args) {
        int x = 5;
        int hasil = x++ + ++x;
        System.out.println("x      = " + x);
        System.out.println("hasil  = " + hasil);

        int y = 5;
        int hasil2 = y++ + y++;
        System.out.println("y      = " + y);
        System.out.println("hasil2 = " + hasil2);
    }
}

Output yang Dihasilkan:

text
x      = 7
hasil  = 12
y      = 7
hasil2 = 11

Baris 4 memperlihatkan hasil bernilai 12 dengan x berakhir di 7 — tepat sesuai urutan cerita di atas. Baris 9 memakai dua postfix berurutan: y++ pertama menyerahkan 5 (y menjadi 6), y++ kedua menyerahkan 6 (y menjadi 7), sehingga hasil2 bernilai 11.

Operator unary menuntas daftar operator yang bekerja pada operand tunggal. Bab berikutnya menyajikan operator paling ringkas di Java untuk pengambilan keputusan: ternary operator kondisi ? a : b yang memadukan fungsi if-else ke dalam satu ekspresi.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

EkspresiGabunganIncrement.java

Unduh berkas
java
public class EkspresiGabunganIncrement {
    public static void main(String[] args) {
        int x = 5;
        int hasil = x++ + ++x;
        System.out.println("x      = " + x);
        System.out.println("hasil  = " + hasil);

        int y = 5;
        int hasil2 = y++ + y++;
        System.out.println("y      = " + y);
        System.out.println("hasil2 = " + hasil2);
    }
}

NaikTurun.java

Unduh berkas
java
public class NaikTurun {
    public static void main(String[] args) {
        int a = 5;
        System.out.println("a   = " + a);
        System.out.println("a++ = " + (a++));   // nilai lama dipakai dulu, lalu a naik
        System.out.println("a   = " + a);
        System.out.println("++a = " + (++a));   // a naik dulu, lalu nilai barunya dipakai

        int b = 10;
        System.out.println("b-- = " + (b--));
        System.out.println("b   = " + b);
        System.out.println("--b = " + (--b));
    }
}

OperatorUnary.java

Unduh berkas
java
public class OperatorUnary {
    public static void main(String[] args) {
        int suhuRuang = 24;
        int titikBeku = -10;

        System.out.println("+suhuRuang = " + (+suhuRuang));
        System.out.println("-suhuRuang = " + (-suhuRuang));
        System.out.println("-titikBeku = " + (-titikBeku));
        System.out.println("~suhuRuang = " + (~suhuRuang) + " (komplemen bit)");
    }
}