Apa asosiasi operator dan mengapa itu penting?


89

Apa asosiativitas (untuk operator) dan mengapa itu penting?

Diperbarui: asosiasi operator


2
Jenis asosiatif apa? Asosiasi operator?
Ikke

26
@ Neil Butterworth - Itu adalah komentar yang sangat kasar untuk pertanyaan yang tampaknya masuk akal. Inti dari situs ini adalah menjadi gudang pusat untuk SEMUA pengetahuan pemrograman termasuk hal-hal yang tercakup dalam teks pengantar. Adapun Anda mengomentari @Jian Lin yang menjawab komentarnya sendiri yang juga dapat diterima seperti yang dijelaskan dalam pertanyaan pertama di FAQ resmi. Seseorang dengan level perwakilan Anda seharusnya lebih tahu. Jika Anda tidak setuju dengan itu, setidaknya bersikaplah sopan.
Rob Allen

1
@Rob Allen Lihat postingannya yang lain. Juga, saya tidak mengatakan dia seharusnya tidak menjawab kirimannya sendiri, hanya saja itu tidak membantu. Dan saya akan membuat kesepakatan untuk Anda - saya tidak akan memberi tahu Anda cara menyusun kiriman Anda di sini jika Anda tidak memberi tahu saya cara menyusun kiriman saya.

Jawaban:


106

Bagi operator, asosiativitas berarti ketika operator yang sama muncul berturut-turut, maka kemunculan operator mana yang kita terapkan terlebih dahulu. Berikut ini, biarlah Qmenjadi operator

a Q b Q c

Jika Qdibiarkan 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

apakah Anda tahu bagaimana menemukan asosiatif apakah itu kiri atau kanan untuk grammer tertentu?
pengguna2510115

1
Misalnya expr -> expr + term;adalah asosiatif kiri dan expr -> term + exprasosiatif kanan.
Subin Sebastian

15
Di baris pertama jawaban Anda, alih-alih "saat operator yang sama muncul", lebih tepat untuk mengatakan "saat operator dengan prioritas yang sama muncul". Contoh: a * b / c => di mana * dan / memiliki prioritas yang sama.
1O1

2
@ 1O1 terima kasih, tetapi apa yang terjadi jika operator dengan prioritas yang sama memiliki asosiasi yang berbeda? Bagaimana a * b / cmengevaluasi 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.
Johannes Schaub - litb

2
@ Mark saya tidak tahu, tapi saya tidak bisa memikirkan bagaimana seharusnya bekerja. Mungkin layak pertanyaan tambahan stackoverflow
Johannes Schaub - litb

13

Ada tiga jenis asosiatif:

Properti asosiatif dalam matematika

Urutan Operasi dalam bahasa pemrograman

Asosiatif dalam cache CPU.

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.


3
keterkaitan (atau ketetapan) operator adalah properti yang menentukan bagaimana operator dengan prioritas yang sama dikelompokkan tanpa tanda kurung - frasa itu sempurna untuk membuat saya mengerti
Rafael Eyng

7

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
Sepertinya ada kesalahan dalam jawabannya: 2 % 5mengevaluasi ke 2, bukan 0.
6005

6

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.

Perbarui 2020:

Keadaan tentang itu 3 - 2 - 1mungkin 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.


4
Jika Anda sudah mengetahui jawabannya, lalu mengapa Anda mengajukan pertanyaan tersebut?
Robert Harvey

6
itu untuk membantu orang baru. Saya ingat belajar C sejak lama dan tidak tahu apa sebenarnya asosiatif itu sampai nanti.
nonopolaritas

3
Saya menduga bahwa kebanyakan orang yang belajar C dapat melakukannya tanpa "bantuan" Anda.

1
hm, misalnya, apakah asosiatif terbatas pada operator yang sama, atau untuk operator pada tingkat prioritas yang sama? Bisakah banyak orang menjawabnya dengan pasti tanpa memeriksa buku atau referensi?
nonopolaritas

13
@ Neil Butterworth, kenapa begitu bermusuhan? Menurut saya, memposting jawaban atas pertanyaan Anda sendiri dapat diterima. Ini ada di FAQ, dan telah disebutkan di podcast beberapa kali.
Jay Conrod

5

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:

  1. (12 - 5) + 3 = 10
  2. 12 - (5 + 3) = 4

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.


Contoh Anda akan lebih jelas jika semuanya menggunakan operan yang sama.
Michael Carman

Apa yang akan terjadi jika dua operator dengan prioritas yang sama muncul dalam ekspresi tanpa tanda kurung, tetapi salah satunya telah meninggalkan asosiatif dan yang lainnya memiliki kanan? Apakah itu hanya menggunakan asosiatif dari operator mana yang ditemukan pertama kali?
Hector

itu tidak dapat terjadi karena presedansi yang sama berarti asosiatif yang sama. Jika bukan ini masalahnya, mungkin ada ambiguitas yang mengancam keberadaan realitas.
Ankur S

3

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.


1

Jika yang Anda maksud adalah asosiasi operator:

Ini mendefinisikan cara ekspresi diuraikan. Ini memberikan standar, jadi setiap ekspresi diuraikan dengan cara yang sama.

Ini sebagian besar penting untuk operasi yang memiliki presedensi yang sama, bila mungkin ada efek samping.


0

Sebagian besar contoh sebelumnya telah menggunakan konstanta. Jika argumen kebetulan adalah pemanggilan fungsi, urutan pemanggilan tersebut dapat ditentukan oleh aturan asosiasi, tentu saja tergantung pada kompiler Anda. Dan jika fungsi tersebut memiliki efek samping ..


0

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 .


0

Asosiatif berada di bawah urutan komputasi dalam konsep bahasa pemrograman. Urutan komputasi menentukan arti ekspresi. Ini memiliki dua aturan utama,

  1. Aturan prioritas
  2. 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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.