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:

TingkatKelompok OperatorContoh
1Unary, increment, decrement!x, ++x, x--
2Perkalian, pembagian, modulo*, /, %
3Penjumlahan, pengurangan+, -
4Shift<<, >>
5Perbandingan<, >, <=, >=
6Kesamaan==, !=
7Bitwise AND&
8Bitwise XOR^
9Bitwise OR|
10Logika AND (short-circuit)&&
11Logika OR (short-circuit)||
12Ternary?:
13Penugasan=, +=, -=, 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 #

csharp
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:

text
14
20
8
16
16
True
5
5

Mari kita telaah baris demi baris:

  1. Baris 1 (2 + 3 * 4): Perkalian didahulukan, sehingga hasilnya 2 + 12 = 14.
  2. Baris 2 ((2 + 3) * 4): Tanda kurung memaksa penjumlahan dieksekusi lebih dulu, hasilnya 20.
  3. Baris 3 (20 - 8 - 4): Kedua operator sederajat; associativity kiri menjadikannya (20 - 8) - 4 = 8.
  4. Baris 4 (20 - (8 - 4)): Tanda kurung membalik urutan, hasilnya 16.
  5. Baris 5 (40 / 5 * 2): * dan / sederajat, sehingga evaluasi berjalan dari kiri: (40 / 5) * 2 = 16, bukan 40 / (5 * 2).
  6. Baris 6 (2 + 3 * 4 > 12 && 10 % 3 == 1): Precedence menyusunnya menjadi ((2 + (3 * 4)) > 12) && ((10 % 3) == 1); kiri bernilai 14 > 12 dan kanan bernilai 1 == 1, sehingga hasil akhirnya True.
  7. Baris 8-9 (a = b = 5): Associativity kanan menjalankan b = 5 terlebih dahulu, lalu menyalin nilai b ke a; keduanya tercetak 5.