Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Prioritas dan asosiativitas operator C memengaruhi pengelompokan dan evaluasi operand dalam ekspresi. Prioritas operator berguna hanya jika operator lain dengan prioritas yang lebih tinggi atau lebih rendah ada. Ekspresi dengan operator prioritas yang lebih tinggi dievaluasi terlebih dahulu. Prioritas juga dapat dijelaskan dengan kata "mengikat." Operator dengan prioritas yang lebih tinggi dikatakan memiliki pengikatan yang lebih ketat.
Tabel berikut ini meringkas prioritas dan asosiativitas (urutan evaluasi operand) operator C, mencantumkannya dalam urutan prioritas dari tertinggi hingga terendah. Jika beberapa operator muncul bersama-sama, operator tersebut memiliki prioritas yang sama dan dievaluasi sesuai dengan asosiativitasnya. Operator dalam tabel dijelaskan di bagian yang dimulai dengan Operator Postfix. Bagian lainnya memberikan informasi umum tentang prioritas dan asosiativitas.
Prioritas dan asosiativitas operator C
Simbol 1 | Jenis operasi | Asosiasivitas |
---|---|---|
[ ] ( ) . -> ++ -- (postfix) |
Ekspresi | Kiri ke kanan |
sizeof & * + - ~ ! ++ -- (awalan) |
Unary | Kanan ke kiri |
typecasts | Unary | Kanan ke kiri |
* / % |
Perkalian | Kiri ke kanan |
+ - |
Penambahan | Kiri ke kanan |
<< >> |
Pergeseran bitwise | Kiri ke kanan |
< > <= >= |
Relasional | Kiri ke kanan |
== != |
Persamaan | Kiri ke kanan |
& |
Bitwise-AND | Kiri ke kanan |
^ |
Bitwise-exclusive-OR | Kiri ke kanan |
| |
Bitwise-inclusive-OR | Kiri ke kanan |
&& |
Logical-AND | Kiri ke kanan |
|| |
Logical-OR | Kiri ke kanan |
? : |
Conditional-expression | Kanan ke kiri |
= *= /= %= += -= <<= >>= &= ^= |= |
Penetapan sederhana dan gabungan 2 | Kanan ke kiri |
, |
Evaluasi berurutan | Kiri ke kanan |
1 Operator dicantumkan dalam urutan turun prioritas. Jika beberapa operator muncul pada baris yang sama atau dalam grup, operator tersebut memiliki prioritas yang sama.
2 Semua operator penetapan sederhana dan gabungan memiliki prioritas yang sama.
Ekspresi dapat berisi beberapa operator dengan prioritas yang sama. Ketika beberapa operator tersebut muncul pada tingkat yang sama dalam ekspresi, evaluasi berlanjut sesuai dengan asosiativitas operator, baik dari kanan ke kiri maupun dari kiri ke kanan. Arah evaluasi tidak memengaruhi hasil ekspresi yang mencakup lebih dari satu perkalian (*
), penambahan (+
), atau operator biner-bitwise (&
, |
, atau ^
) pada tingkat yang sama. Urutan operasi tidak ditentukan oleh bahasa. Pengompilasi bebas untuk mengevaluasi ekspresi tersebut dalam urutan apa pun, jika pengompilasi dapat menjamin hasil yang konsisten.
Hanya operator sequential-evaluation (,
), logical-AND (&&
), logical-OR (||
), conditional-expression (? :
), dan function-call yang merupakan titik urutan, dan oleh karena itu menjamin urutan evaluasi tertentu untuk operand mereka. Operator function-call adalah sekumpulan tanda kurung setelah pengidentifikasi fungsi. Operator evaluasi berurutan (,
) dijamin akan mengevaluasi operand-nya dari kiri ke kanan. (Operator koma dalam panggilan fungsi tidak sama dengan operator evaluasi berurutan dan tidak memberikan jaminan tersebut.) Untuk informasi selengkapnya, lihat Titik urutan.
Operator logika juga menjamin evaluasi operand mereka dari kiri ke kanan. Namun, operator tersebut mengevaluasi jumlah operand terkecil yang diperlukan untuk menentukan hasil ekspresi. Ini disebut evaluasi "sirkuit pendek". Dengan demikian, beberapa operand ekspresi mungkin tidak dievaluasi. Misalnya, dalam ekspresi
x && y++
operand kedua, y++
, dievaluasi hanya jika x
adalah benar (bukan nol). Dengan demikian, y
tidak dinaikkan jika x
salah (0).
Contoh
Daftar berikut ini memperlihatkan bagaimana pengompilasi secara otomatis mengikat beberapa ekspresi sampel:
Ekspresi | Pengikatan Otomatis |
---|---|
a & b || c |
(a & b) || c |
a = b || c |
a = (b || c) |
q && r || s-- |
(q && r) || s-- |
Dalam ekspresi pertama, operator bitwise-AND (&
) memiliki prioritas yang lebih tinggi daripada operator logical-OR (||
), sehingga a & b
membentuk operand pertama dari operasi logical-OR.
Dalam ekspresi kedua, operator logical-OR (||
) memiliki prioritas yang lebih tinggi daripada operator simple-assignment (=
), sehingga b || c
dikelompokkan sebagai operand sebelah kanan dalam penetapan. Perhatikan bahwa nilai yang ditetapkan ke a
adalah 0 atau 1.
Ekspresi ketiga menunjukkan ekspresi yang terbentuk dengan benar yang dapat memberikan hasil yang tidak terduga. Operator logical-AND (&&
) memiliki prioritas yang lebih tinggi daripada operator logical-OR (||
), sehingga q && r
dikelompokkan sebagai operand. Karena operator logis menjamin evaluasi operand dari kiri ke kanan, q && r
dievaluasi sebelum s--
. Namun, jika q && r
dievaluasi ke nilai bukan nol, s--
tidak dievaluasi, dan s
tidak diturunkan. Jika tidak menurunkan s
akan menyebabkan masalah dalam program Anda, s--
akan muncul sebagai operand pertama ekspresi, atau s
harus diturunkan dalam operasi terpisah.
Ekspresi berikut ilegal dan menghasilkan pesan diagnostik pada waktu kompilasi:
Ekspresi Ilegal | Pengelompokan Default |
---|---|
p == 0 ? p += 1: p += 2 |
( p == 0 ? p += 1 : p ) += 2 |
Dalam ekspresi ini, operator persamaan (==
) memiliki prioritas tertinggi, sehingga p == 0
dikelompokkan sebagai operand. Operator conditional-expression (? :
) memiliki prioritas tertinggi berikutnya. Operand pertamanya adalah p == 0
, dan operand keduanya adalah p += 1
. Namun, operand terakhir dari operator conditional-expression dianggap p
bukan p += 2
, karena kemunculan p
ini mengikat lebih dekat ke operator conditional-expression daripada operator compound-assignment. Kesalahan sintaks terjadi karena += 2
tidak memiliki operand sebelah kiri. Anda harus menggunakan tanda kurung untuk mencegah kesalahan jenis ini dan menghasilkan kode yang lebih mudah dibaca. Misalnya, Anda dapat menggunakan tanda kurung seperti yang ditunjukkan di bawah ini untuk memperbaiki dan mengklarifikasi contoh sebelumnya:
( p == 0 ) ? ( p += 1 ) : ( p += 2 )