Ekspresi pada program nyata jarang hanya berisi satu operator: total + pajak * diskon, sudahBayar || member && kupon, "Nilai: " + a + b. Ketika banyak operator berbagi satu ekspresi, Java membutuhkan aturan yang menentukan bagian mana dihitung lebih dahulu — aturan itu bernama operator precedence, urutan prioritas yang tetap dan dijamin spesifikasi bahasa. Memahami urutan tersebut berarti membaca ekspresi dengan benar tanpa menebak; dan ketika urutan bawaan tidak sesuai kebutuhan kita, tanda kurung hadir sebagai alat kendali eksplisit. Chapter ini menyusun tabel prioritasnya lalu membuktikan lewat eksekusi nyata betapa besar perbedaan yang dibuat sepasang kurung.
Urutan Prioritas Operator #
Tabel berikut merangkum urutan prioritas operator yang telah kita pelajari sepanjang Section ini, dari yang paling tinggi hingga paling rendah. Operator di baris atas mengikat operandnya lebih kuat sehingga dikerjakan lebih dahulu; operator di baris yang sama memiliki prioritas setara dan dikerjakan sesuai arah asosiativitasnya.
| Prioritas | Kategori | Operator | Asosiativitas |
|---|---|---|---|
| 1 | postfix | x++ x-- | kiri ke kanan |
| 2 | unary | ++x --x +x -x ! ~ | kanan ke kiri |
| 3 | multiplicative | * / % | kiri ke kanan |
| 4 | additive | + - | kiri ke kanan |
| 5 | shift | << >> >>> | kiri ke kanan |
| 6 | relational | < > <= >= instanceof | kiri ke kanan |
| 7 | equality | == != | kiri ke kanan |
| 8 | bitwise AND | & | kiri ke kanan |
| 9 | bitwise XOR | ^ | kiri ke kanan |
| 10 | bitwise OR | ` | ` |
| 11 | logical AND | && | kiri ke kanan |
| 12 | logical OR | ` | |
| 13 | ternary | ? : | kanan ke kiri |
| 14 | assignment | = += -= *= /= %= dan lainnya | kanan ke kiri |
Dua kebiasaan membaca yang paling penting: perkalian mengalahkan penjumlahan (baris 3 di atas baris 4), dan && mengalahkan || (baris 11 di atas baris 12). Perhatikan pula bahwa operator shift berada di bawah penjumlahan — detail yang mengejutkan banyak programmer, sebab sebagian besar bahasa lain menempatkannya lebih tinggi.
Tanda Kurung Mengubah Hasil #
Bukti paling jelas peran prioritas adalah membandingkan ekspresi dengan dan tanpa kurung. Ekspresi a + b * c dikerjakan sebagai a + (b * c) karena * lebih tinggi dari +. Operator dengan prioritas setara dikerjakan mengikuti asosiativitas — umumnya kiri ke kanan — sehingga 10 - 4 - 3 sama dengan (10 - 4) - 3, bukan 10 - (4 - 3).
public class KurungMengubahHasil {
public static void main(String[] args) {
int a = 10;
int b = 2;
int c = 3;
System.out.println("a + b * c = " + (a + b * c));
System.out.println("(a + b) * c = " + ((a + b) * c));
System.out.println("a - b - c = " + (a - b - c));
System.out.println("a - (b - c) = " + (a - (b - c)));
System.out.println("2 << 1 + 2 = " + (2 << 1 + 2));
System.out.println("(2 << 1) + 2 = " + ((2 << 1) + 2));
}
}Output yang Dihasilkan:
a + b * c = 16
(a + b) * c = 36
a - b - c = 5
a - (b - c) = 11
2 << 1 + 2 = 16
(2 << 1) + 2 = 6Mari kita telaah pasangan-pasangan hasilnya:
- Baris 7-8:
a + b * cdihitung10 + 6menjadi16; kurung memaksa(10 + 2) * 3menjadi36— hasil yang sepenuhnya berbeda dari operand yang sama. - Baris 9-10:
a - b - cdihitung(10 - 2) - 3menjadi5karena operator-asosiatif kiri; kurung mengubahnya menjadi10 - (2 - 3)yaitu11. - Baris 11-12:
2 << 1 + 2dikerjakan sebagai2 << (1 + 2)— penjumlahan lebih dulu — menghasilkan16; kurung menggeser lebih dulu (2 << 1=4) lalu menambah2menjadi6.
Prioritas pada Logika dan String #
Urutan prioritas juga menentukan arti kondisi majemuk. Karena && berada di atas ||, ekspresi sudahBayar || member && kuponTersedia dibaca sebagai sudahBayar || (member && kuponTersedia) — bukan (sudahBayar || member) && kuponTersedia. Pada penggabungan teks, aturan asosiativitas kiri membuat "Total: " + 1 + 2 menggabungkan angka satu per satu sebagai teks, sedangkan kurung memaksa penjumlahan numerik lebih dahulu.
public class PrioritasLogikaString {
public static void main(String[] args) {
boolean sudahBayar = true;
boolean member = false;
boolean kuponTersedia = false;
boolean hasil1 = sudahBayar || member && kuponTersedia;
boolean hasil2 = (sudahBayar || member) && kuponTersedia;
System.out.println("sudahBayar || member && kuponTersedia = " + hasil1);
System.out.println("(sudahBayar || member) && kuponTersedia = " + hasil2);
System.out.println("\"Total: \" + 1 + 2 = " + ("Total: " + 1 + 2));
System.out.println("\"Total: \" + (1 + 2) = " + ("Total: " + (1 + 2)));
}
}Output yang Dihasilkan:
sudahBayar || member && kuponTersedia = true
(sudahBayar || member) && kuponTersedia = false
"Total: " + 1 + 2 = Total: 12
"Total: " + (1 + 2) = Total: 3Baris 7 memakai pengelompokan bawaan: member && kuponTersedia bernilai false, lalu true || false menghasilkan true. Baris 8 menggeser pengelompokan dengan kurung: (true || false) bernilai true, lalu true && false menghasilkan false — dua kesimpulan berlawanan dari operand yang identik. Dua baris terakhir mengulang pelajaran Chapter Arithmetic Operators: tanpa kurung, angka 1 dan 2 bergabung sebagai teks menjadi Total: 12; dengan kurung, keduanya dijumlahkan dahulu menjadi Total: 3.
Ada satu aspek perilaku operator yang belum kita bahas dan berjalin dengan urutan evaluasi: operator && dan || berhenti mengevaluasi begitu kesimpulannya pasti. Chapter penutup Section ini mengupas short-circuit evaluation — lengkap dengan bukti bahwa method di operand kanan benar-benar tidak pernah dipanggil.
Referensi #
- Java Language Specification — Bab 15 Expressions
- Oracle Dev.java — Learn Java
- Oracle Java SE 25 Documentation
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
KurungMengubahHasil.java
Unduh berkaspublic class KurungMengubahHasil {
public static void main(String[] args) {
int a = 10;
int b = 2;
int c = 3;
System.out.println("a + b * c = " + (a + b * c));
System.out.println("(a + b) * c = " + ((a + b) * c));
System.out.println("a - b - c = " + (a - b - c));
System.out.println("a - (b - c) = " + (a - (b - c)));
System.out.println("2 << 1 + 2 = " + (2 << 1 + 2));
System.out.println("(2 << 1) + 2 = " + ((2 << 1) + 2));
}
}
PrioritasLogikaString.java
Unduh berkaspublic class PrioritasLogikaString {
public static void main(String[] args) {
boolean sudahBayar = true;
boolean member = false;
boolean kuponTersedia = false;
boolean hasil1 = sudahBayar || member && kuponTersedia;
boolean hasil2 = (sudahBayar || member) && kuponTersedia;
System.out.println("sudahBayar || member && kuponTersedia = " + hasil1);
System.out.println("(sudahBayar || member) && kuponTersedia = " + hasil2);
System.out.println("\"Total: \" + 1 + 2 = " + ("Total: " + 1 + 2));
System.out.println("\"Total: \" + (1 + 2) = " + ("Total: " + (1 + 2)));
}
}