Satu expression boleh memuat beberapa operator sekaligus, misalnya 2 + 3 * 4 > 12 && 10 % 3 == 1. Agar hasilnya selalu pasti, compiler mengikuti dua aturan: precedence menentukan operator mana yang didahulukan, dan associativity menentukan arah evaluasi ketika beberapa operator berada pada tingkat yang sama.
Precedence: Operator Mana yang Didahulukan #
Tabel berikut merangkum tingkat precedence dari yang paling didahulukan:
| Tingkat | Kelompok Operator | Contoh |
|---|---|---|
| 1 | Unary, increment, decrement | !x, ++x, x-- |
| 2 | Perkalian, pembagian, modulo | *, /, % |
| 3 | Penjumlahan, pengurangan | +, - |
| 4 | Shift | <<, >> |
| 5 | Perbandingan | <, >, <=, >= |
| 6 | Kesamaan | ==, != |
| 7 | Bitwise AND | & |
| 8 | Bitwise XOR | ^ |
| 9 | Bitwise OR | | |
| 10 | Logika AND (short-circuit) | && |
| 11 | Logika OR (short-circuit) | || |
| 12 | Ternary | ?: |
| 13 | Penugasan | =, +=, -=, dst. |
Karena * berada di atas +, expression 2 + 3 * 4 dievaluasi sebagai 2 + (3 * 4) dan menghasilkan 14, bukan 20.
Associativity: Arah Evaluasi #
Ketika operator berderet pada tingkat yang sama, associativity menentukan arah. Operator aritmetika biner bersifat kiri-ke-kanan (left-associative): 20 - 8 - 4 dievaluasi sebagai (20 - 8) - 4. Operator penugasan bersifat kanan-ke-kiri (right-associative), sehingga a = b = 5 mengisi nilai 5 ke b terlebih dahulu, lalu menyalinnya ke a.
Contoh dan Bedah Baris #
Console.WriteLine(2 + 3 * 4);
Console.WriteLine((2 + 3) * 4);
Console.WriteLine(20 - 8 - 4);
Console.WriteLine(20 - (8 - 4));
Console.WriteLine(40 / 5 * 2);
Console.WriteLine(2 + 3 * 4 > 12 && 10 % 3 == 1);
int a, b;
a = b = 5;
Console.WriteLine(a);
Console.WriteLine(b);Output yang Dihasilkan:
14
20
8
16
16
True
5
5Mari kita telaah baris demi baris:
- Baris 1 (
2 + 3 * 4): Perkalian didahulukan, sehingga hasilnya2 + 12 = 14. - Baris 2 (
(2 + 3) * 4): Tanda kurung memaksa penjumlahan dieksekusi lebih dulu, hasilnya20. - Baris 3 (
20 - 8 - 4): Kedua operator sederajat; associativity kiri menjadikannya(20 - 8) - 4 = 8. - Baris 4 (
20 - (8 - 4)): Tanda kurung membalik urutan, hasilnya16. - Baris 5 (
40 / 5 * 2):*dan/sederajat, sehingga evaluasi berjalan dari kiri:(40 / 5) * 2 = 16, bukan40 / (5 * 2). - Baris 6 (
2 + 3 * 4 > 12 && 10 % 3 == 1): Precedence menyusunnya menjadi((2 + (3 * 4)) > 12) && ((10 % 3) == 1); kiri bernilai14 > 12dan kanan bernilai1 == 1, sehingga hasil akhirnyaTrue. - Baris 8-9 (
a = b = 5): Associativity kanan menjalankanb = 5terlebih dahulu, lalu menyalin nilaibkea; keduanya tercetak5.