Operator
precedence seperti diperlihatkan pada
gambar 1 adalah bentuk penentuan dari operator mana yang dieksekusi terlebih dahulu dalam sebuah ekspresi dengan lebih dari satu operator
precedence yang berbeda dalam basa pemrograman C.
Contoh: 10 + 20 * 30
10 + 20 * 30 diselesaikan dengan operasi 10 + (20 * 30) dan tidak diperlakukan seperti kondisi operasi berikut (10 + 20) * 30.
|
Gambar 1 operator precedence pada bahasa C |
Operator asosiatifitas seperti diperlihatkan pada
gambar 2 digunakan ketika dua operator dari
precedence yang sama muncul dalam satu buah ekspresi dalam program. Hubungan asosiatifitas dapat dilakukan dari kiri ke kanan (
left-to-right) atau kanan ke kiri (
right-to-left).
Contoh: operator '*' dan '/' memiliki precedence sama dan asosiatifitasnya adalah kiri ke kanan. sehingga ekspresi operasi dari "100 / 10 * 10" adalah "(100 / 10) * 10".
|
Gambar 2 operator asosiatifitas pada bahasa C |
Precedence operator dan asosiatifitasnya adalah dua karakteristik dari operator yang menentukan evaluasi dari subekspresi karena tidak menggunakan tanda kurung pada persamaan operasi matematika.
Contoh: 100 + 200 / 10 - 3 * 10
|
Gambar 3 operator precedence dan asosiatifitas pada bahasa C |
satu, Asosiatifitas operator hanya digunakan ketika terdapat dua atau lebih operator pada precedence yang sama. Poin yang perlu dicatat adalah asosiatifitas (gambar 3) tidak mendefinisikan urutan operand dari sebuah operator tunggal yang dievaluasi. Contoh, perhatikan program berikut ini, asosiatifitas dari operator "+" adalah kiri ke kanan, tetapi bukan berarti f1() akan selalu dipanggil sebelum f2(), dimana Output dari program bergantung pada jenis kompilator yang digunakan.
Contoh:
// Asosiatifitas tidak
// digunakan pada program
// berikut ini.
// Output dari kompilator
// masih bersifat dependen
// atau tidak berkaitan satu
// sama lain.
#include <stdio.h>
int x = 0;
int f1()
{
x = 5;
return x;
}
int f2()
{
x = 10;
return x;
}
int main()
{
int p = f1() + f2();
printf("%d ", x);
return 0;
}
dua, Semua operator dengan precedence sama memiliki asosiatifitas yang sama. Hal ini sangat penting, jika tidak, tidak ada cara bagi kompilator untuk menentukan perintah evaluasi dari ekspresi yang memiliki dua operator dari precedence sama dan asosiatifitas berbeda. Contoh, operator "+" dan "-" memiliki asosiatifitas yang sama.
tiga, Precedence dan asosiatifitas dari postfix ++ dan prefix ++ adalah berbeda. Precedence dari postfix ++ adalah lebih dari prefix ++, tingkat asosiatifitasnya juga berbeda. Asosiatifitas postfix ++ adalah dari kiri ke kanan dan asosiatifitas dari prefix ++ adalah dari kanan ke kiri.
empat, Tanda koma memiliki precedence yang kecil diantara semua operator dan harus digunakan secara hati-hati. Contoh, perhatikan bentuk program berikut ini.
Contoh:
#include <stdio.h>
int main()
{
int a;
a = 1, 2, 3;
// Dievaluasi sebagai
// (a = 1), 2, 3
printf("%d", a);
return 0;
}
lima, Tidak ada rantai pembanding operator pada bahasa C. pada Python, bentuk ekspresi seperti "c > b > a" adalah sama seperti "c >b dan b > a", tetapi tipe seperti ini tidak ada pada bahasa C. Contoh perhatikan program berikut. Output dari program adalah false.
Contoh:
#include <stdio.h>
int main()
{
int a = 10, b = 20, c = 30;
// (c > b > a) diperlakukan
// sebagai ((c > b) > a),
// tingkat asosiatifitas dari
// '>' adalah left to right.
// Karena itu nilai dari ((30
// > 20) > 10) menjadi (1 >
// 20).
if (c > b > a)
printf("TRUE");
else
printf("FALSE");
return 0;
}
Tabel precedence dan asosiatifitas pada bahasa C
Operator | Description | Associativity |
---|
( )
[ ]
.
->
++ — | Tanda kurung (panggilan fungsi) (lihat Catatan 1)
Tanda kurung (subskrip array)
Pemilihan anggota melalui nama objek
Pemilihan anggota melalui penunjuk
Kenaikan / penurunan Postfix (lihat Catatan 2)
| left-to-right |
++ —
+ –
! ~
(type)
*
&
sizeof | Kenaikan / penurunan prefiks
Plus / minus unary
Negasi logis / pelengkap bitwise
Transmisikan (ubah nilai menjadi nilai sementara jenis)
Dereferensi
Alamat (operan)
Tentukan ukuran dalam byte pada implementasi ini
| right-to-left |
* / % | Perkalian / pembagian / modulus | left-to-right |
+ – | Penjumlahan / pengurangan | left-to-right |
<< >> | Bitwise bergeser ke kiri, Bitwise bergeser ke kanan | left-to-right |
< <=
> >= | Relasional kurang dari / kurang dari atau sama dengan
Relasional lebih besar dari / lebih besar dari atau sama dengan
| left-to-right |
== != | Relasional sama dengan / tidak sama dengan | left-to-right |
& | Bitwise AND | left-to-right |
^ | Bitwise exclusive OR | left-to-right |
| | Bitwise inclusive OR | left-to-right |
&& | Logika AND | left-to-right |
| | | Logika OR | left-to-right |
? : | Ternary conditional | right-to-left |
=
+= -=
*= /=
%= &=
^= |=
<<= >>= | Penugasan
Penugasan penjumlahan / pengurangan
Penugasan perkalian / pembagian
Modulus / bitwise AND penugasan
Penugasan eksklusif OR / inklusif bitwise
Bitwise pergeseran ke kiri / kanan
| right-to-left |
, | Koma (ekspresi pemisah) | left-to-right |
Adalah suatu hal baik jika programmer bisa pengetahui tingkat precedence dan asosiatifitas dari jenis operator yang akan dipergunakan pada suatu program yang dibuat, namun jika tidak demikian akan lebih baik jika menggunakan tanda kurung dalam penggunaan dan pembentukan operator dalam suatu algoritma pemrograman, khususnya untuk jenis operator yang jarang digunakan. Penggunaan tanda kurung meningkatkan kemampuan membaca kode program jika tidak bisa diketahui tingkat precedence atau asosiatifitas dari operator yang akan digunakan oleh programmer tersebut.
Memahami operator precedence (prioritas operator) dan associativity (asosiatifitas) dalam bahasa C memberikan sejumlah kelebihan yang sangat penting bagi programmer. Berikut adalah beberapa kelebihan utama:
- Kode yang Lebih Jelas dan Terstruktur: Pemahaman yang baik tentang prioritas dan asosiatifitas operator memungkinkan programmer untuk menulis kode yang lebih jelas dan terstruktur. Hal ini membuat kode lebih mudah dibaca dan dipahami oleh orang lain (atau oleh diri sendiri di masa depan).
- Mengurangi Kesalahan Pemrograman: Mengetahui bagaimana operator dievaluasi membantu dalam mengurangi kesalahan yang disebabkan oleh asumsi yang salah tentang urutan evaluasi. Ini penting untuk menghindari bug yang sulit dideteksi.
- Efisiensi dalam Penulisan Kode: Dengan memahami prioritas dan asosiatifitas, programmer dapat menulis ekspresi yang lebih efisien tanpa perlu menggunakan tanda kurung tambahan. Ini membuat kode lebih singkat dan lebih mudah dikelola.
- Mempermudah Debugging: Ketika terjadi kesalahan dalam kode, memahami bagaimana ekspresi dievaluasi dapat mempermudah proses debugging. Programmer dapat dengan cepat menentukan di mana letak kesalahan evaluasi operator dan memperbaikinya.
- Penggunaan yang Efektif dalam Algoritma Kompleks: Dalam algoritma yang kompleks, penggunaan yang tepat dari prioritas dan asosiatifitas operator dapat meningkatkan efisiensi dan efektivitas algoritma. Ini penting dalam pengembangan aplikasi yang membutuhkan kinerja tinggi.
- Penulisan Ekspresi Logis dan Kondisional yang Akurat: Operator logika dan kondisional sering digunakan dalam pengambilan keputusan. Memahami prioritas operator logika memastikan bahwa keputusan logis dibuat dengan benar.
- Menghindari Penggunaan Tanda Kurung yang Tidak Perlu: Dengan pemahaman yang baik, programmer dapat menghindari penggunaan tanda kurung yang tidak perlu, yang dapat membuat kode menjadi berantakan dan sulit dibaca.
Kesimpulan
Memahami operator precedence dan associativity sangat penting dalam penulisan kode C yang efisien dan bebas dari kesalahan. Operator precedence menentukan urutan evaluasi operator dalam ekspresi, sementara associativity menentukan arah evaluasi ketika beberapa operator dengan prioritas yang sama muncul. Dengan memahami dan menerapkan konsep-konsep ini dengan benar, programmer dapat memastikan bahwa ekspresi tersebut dievaluasi sesuai dengan harapan, sehingga menghasilkan kode yang lebih jelas dan dapat diandalkan.
Referensi Tambahan:
Artikel ini didedikasikan kepada: Krismonica Dita Pratiwi, Lina Aliyah Tusifa, Lutfia Aldina, Mardiana Lestari, dan Melati Kusumaningtyas.
Apa yang dimaksud dengan precedence atau prioritas pada operator yang digunakan dalam bahasa C?
BalasHapusPrioritas operator atau precedence operator adalah suatu penentuan pengelompokkan istilah dalam ekspresi dan memustuskan bagaimana ekspresi tersebut akan dievaluasi dalam suatu program. Operator tertentu sudah pasti memiliki precedence yang lebih tinggi daripda operator lainnya. Contoh, operator perkalian memiliki nilai precedence yang lebih tinggi daripada operator penjumlahan dalam bahasa C.
HapusApa yang dimaksud dengan asosiatifitas operator pada bahasa pemrograman C?
BalasHapusDalam bahasa pemrograman, asosiasi operator merupakan properti yang menentukan bagaimana operator dengan prioritas yang sama dikelompokkan tanpa tanda kurung.
HapusTingkat asosiatifitas atau associativity operator pada bahasa pemrograman mendefinisikan urutan dimana operator tersebut dengan prioritas yang sama dievaluasi dalam sebuah ekspresi. Asosiatifitas bisa berasal dari kiri ke kanan ataupun juga sebaliknya dari kanan ke kiri dalam suatu urutan. Dalam bahasa C, setiap operator memiliki tingkat prioritas yang bersifat tetap dalam hubungan (asosiatifitasnya) dengan operator lain.
BalasHapus