Apa asosiativitas (untuk operator) dan mengapa itu penting?
Diperbarui: asosiasi operator
Apa asosiativitas (untuk operator) dan mengapa itu penting?
Diperbarui: asosiasi operator
Jawaban:
Bagi operator, asosiativitas berarti ketika operator yang sama muncul berturut-turut, maka kemunculan operator mana yang kita terapkan terlebih dahulu. Berikut ini, biarlah Q
menjadi operator
a Q b Q c
Jika Q
dibiarkan asosiatif, maka dievaluasi sebagai
(a Q b) Q c
Dan jika asosiatif benar, maka ia dievaluasi sebagai
a Q (b Q c)
Ini penting, karena mengubah arti ekspresi. Pertimbangkan operator pembagian dengan aritmatika bilangan bulat, yang merupakan asosiatif kiri
4 / 2 / 3 <=> (4 / 2) / 3 <=> 2 / 3 = 0
Jika asosiatifnya benar, itu akan mengevaluasi ke ekspresi yang tidak terdefinisi, karena Anda akan membaginya dengan nol
4 / 2 / 3 <=> 4 / (2 / 3) <=> 4 / 0 = undefined
expr -> expr + term;
adalah asosiatif kiri dan expr -> term + expr
asosiatif kanan.
a * b / c
mengevaluasi apakah *
akan menjadi asosiasi kiri tetapi /
akan menjadi asosiatif kanan? Lalu ada kontradiksi. Jadi menurut saya orang perlu mengatakan "ketika operator dengan prioritas dan asosiatif yang sama" jika Anda ingin mencakup beberapa operator.
Ada tiga jenis asosiatif:
Properti asosiatif dalam matematika
Urutan Operasi dalam bahasa pemrograman
Properti Asosiatif dalam matematika adalah properti operator seperti penjumlahan (+). Properti ini memungkinkan Anda untuk mengatur ulang tanda kurung tanpa mengubah nilai pernyataan, yaitu:
(a + b) + c = a + (b + c)
Dalam bahasa pemrograman, asosiativitas (atau ketetapan) dari suatu operator adalah properti yang menentukan bagaimana operator dengan prioritas yang sama dikelompokkan tanpa adanya tanda kurung; yaitu dalam urutan apa setiap operator dievaluasi. Ini dapat berbeda di antara bahasa pemrograman.
Dalam cache CPU, asosiatif adalah metode untuk mengoptimalkan kinerja.
Sederhana!!
Left Associative means we evaluate our expression from left to right
Right Associative means we evaluate our expression from right to left
Kami tahu *, /, dan% memiliki prioritas yang sama, tetapi sesuai dengan keterkaitan, jawaban dapat berubah:
Misalnya: Kami memiliki ekspresi: 4 * 8/2% 5
Left associative: (4 * 8) / 2 % 5 ==> (32 / 2) % 5 ==> 16 % 5 ==> 1
Right associative: 4 * 8 /(2 % 5) ==> 4 * ( 8 / 2) ==> 4 * 4 ==> 16
2 % 5
mengevaluasi ke 2
, bukan 0
.
ini adalah urutan evaluasi untuk operator dengan prioritas yang sama. Urutan KIRI KE KANAN atau KANAN KE KIRI penting. Untuk
3 - 2 - 1
jika KIRI ke KANAN, maka benar
(3 - 2) - 1
dan 0. Jika KANAN ke KIRI, maka benar
3 - (2 - 1)
dan hasilnya 2. Dalam kebanyakan bahasa, kita katakan bahwa operator minus memiliki asosiasi KIRI KE KANAN.
Keadaan tentang itu 3 - 2 - 1
mungkin tampak sepele, jika klaimnya, "tentu saja kami melakukannya dari kiri ke kanan". Namun dalam kasus lain, seperti jika dilakukan di Ruby atau di NodeJS:
$ irb
2.6.3 :001 > 2 ** 3 ** 2
=> 512
Ini **
adalah operator "dengan kekuatan". Asosiatif dari kanan ke kiri. Dan itu benar
2 ** (3 ** 2)
yang 2 ** 9
, yaitu, 512
, bukannya
(2 ** 3) ** 2
yang 8 ** 2
, yaitu, 64
.
Jika Anda mengacu pada "asosiasi operator" - begitulah cara bahasa menentukan bagaimana operator dengan prioritas yang sama dikelompokkan tanpa tanda kurung.
Misalnya, operator + dan - dalam bahasa berbasis C memiliki prioritas yang sama. Saat Anda menulis ekspresi yang menggunakan keduanya (tanpa tanda kurung), compiler harus menentukan urutan evaluasi mereka.
Jika Anda menulis 12 - 5 + 3, evaluasi yang memungkinkan meliputi:
Bergantung pada urutan ekspresi yang Anda evaluasi, Anda bisa mendapatkan hasil yang berbeda. Dalam bahasa berbasis C, + dan - telah meninggalkan asosiatif, yang berarti ekspresi di atas akan dievaluasi sebagai kasus pertama.
Semua bahasa memiliki aturan yang sangat jelas untuk prioritas dan asosiatif. Anda dapat mempelajari lebih lanjut tentang aturan untuk C # di sini. Konsep umum asosiatif dan prioritas operator tercakup dengan baik di wikipedia.
Saya berasumsi yang Anda maksud adalah asosiasi operator ...
Ini adalah urutan pengikatan operan ke operator. Pada dasarnya:
a - b + c
dapat dievaluasi sebagai (dengan asumsi - dan + memiliki prioritas yang sama):
((a - b) + c) atau,
(a - (b + c))
Jika operator dibiarkan asosiatif (mengikat langsung ke operan kiri), itu akan dievaluasi sebagai yang pertama. Jika mereka asosiatif yang benar, itu akan dievaluasi sebagai yang kedua.
Kita semua tahu bahwa diutamakan itu penting, tetapi begitu juga asosiatif dalam menafsirkan makna sebuah ekspresi. Untuk intro yang sangat sederhana, cobalah Power of Operator .
Asosiatif berada di bawah urutan komputasi dalam konsep bahasa pemrograman. Urutan komputasi menentukan arti ekspresi. Ini memiliki dua aturan utama,
- Aturan prioritas
- Aturan asosiatif
aturan prioritas menentukan urutan di mana operator "berdekatan" dari berbagai jenis dievaluasi. Setiap bahasa pemrograman memiliki tabel prioritas operatornya sendiri terkait operatornya.
Kembali ke asosiatif,
Ini mendefinisikan urutan pelaksanaan operasi yang berdekatan dengan prioritas yang sama. Ini memiliki 3 rasa,
asosiasi kiri asosiasi
kanan
non-asosiativitas
Jika sebuah operator adalah kiri-asosiatif ia mengevaluasi dari kiri ke kanan juga jika itu asosiatif kanan ia mengevaluasi dari kanan ke kiri.