Ce este asociativitatea (pentru un operator) și de ce este importantă?
Actualizat: asociativitatea operatorului
În cazul operatorilor, asociativitatea înseamnă că, atunci când același operator apare într-un rând, se aplică mai întâi operatorul care apare. În cele ce urmează, fie Q
operatorul
a Q b Q c
Dacă Q
este asociativ la stânga, atunci se evaluează sub forma
(a Q b) Q c
Iar dacă este asociativ la dreapta, atunci se evaluează sub forma
a Q (b Q c)
Acest lucru este important, deoarece schimbă semnificația unei expresii. Luați în considerare operatorul de împărțire cu aritmetica numerelor întregi, care este asociativ stânga
4 / 2 / 3 <=> (4 / 2) / 3 <=> 2 / 3 = 0
Dacă ar fi fost asociativ la dreapta, ar fi fost evaluat la o expresie nedefinită, deoarece ar fi împărțit la zero
4 / 2 / 3 <=> 4 / (2 / 3) <=> 4 / 0 = undefined
Există trei tipuri de asociativitate:
Proprietatea asociativă în matematică
Ordinea operațiilor în limbajele de programare
Asociativitatea în memoria cache a procesorului.
Proprietatea asociativă în matematică este o proprietate a operatorilor, cum ar fi adunarea (+). Această proprietate vă permite să rearanjați parantezele fără a schimba valoarea unei afirmații, adică::
(a + b) + c = a + (b + c)
În limbajele de programare, asociativitatea (sau fixitatea) unui operator este o proprietate care determină modul în care sunt grupați operatorii de aceeași precedență în absența parantezelor; adică în ce ordine este evaluat fiecare operator. Acest lucru poate diferi de la un limbaj de programare la altul.
În memoria cache a CPU, asociativitatea este o metodă de optimizare a performanței.
este ordinea de evaluare pentru operatorii cu aceeași precedență. Ordinea de la stânga la dreapta sau de la dreapta la stânga este importantă. Pentru
3 - 2 - 1
dacă este de la Stânga la Dreapta, atunci este
(3 - 2) - 1
și este 0. Dacă este de la DREAPTA la STÂNGA, atunci este
3 - (2 - 1)
și este 2. În majoritatea limbilor, se spune că operatorul minus are o asociativitate de la stânga la dreapta.
Dacă vă referiți la "asociativitatea operatorilor", aceasta este modul în care un limbaj determină modul în care sunt grupați operatorii de aceeași precedență în absența parantezelor.
De exemplu, operatorii + și - din limbajele bazate pe C au aceeași precedență. Atunci când scrieți o expresie care îi folosește pe amândoi (fără paranteze), compilatorul trebuie să determine în ce ordine să le evalueze.
Dacă scrieți 12 - 5 + 3, evaluările posibile includ:
În funcție de ordinea în care evaluați expresia, puteți obține rezultate diferite. În limbajele bazate pe C, + și - au asociativitate la stânga, ceea ce înseamnă că expresia de mai sus ar fi evaluată în primul caz.
Toate limbajele au reguli bine definite atât pentru precedență, cât și pentru asociativitate. Puteți afla mai multe despre regulile pentru C# aici. Conceptele generale de operator asociativitate și precedență sunt bine acoperite pe wikipedia.
Simplu!!
Asociativ stânga înseamnă că evaluăm expresia noastră de la stânga la dreapta.
Right Associative înseamnă că evaluăm expresia noastră de la dreapta la stânga.
Știm că *, / și % au aceeași precedență, dar, în funcție de asociativitate, răspunsul se poate schimba:
De exemplu: Avem expresia: 4 * 8 / 2 % 5
Asociativă de stânga: (4 * 8) / 2 % 5 ==> (32 / 2) % 5 ==> 16 % 5 ==> 1
Asociativă dreapta: 4 8 /(2 % 5) ==> 4 ( 8 / 0) ==> Comportament nedefinit
Sper că acest lucru vă va ajuta.
Presupun că vă referiți la asociativitatea operatorilor...
Este ordinea de legare a operanzilor la un operator. În principiu:
a - b + c
ar putea fi evaluat ca (presupunând că - și + au aceeași precedență):
((a - b) + c) sau,
(a - (b + c))
În cazul în care operatorii sunt asociativi stânga (se leagă imediat de operandul din stânga), acesta va fi evaluat ca fiind primul. Dacă sunt asociativi la dreapta, acesta va fi evaluat ca al doilea.
Dacă vă referiți la asociativitatea operatorilor:
Aceasta definește modul în care sunt analizate expresiile. Oferă un standard, astfel încât fiecare expresie este analizată în același mod.
Este important mai ales pentru operațiile care au aceeași precedență, atunci când pot exista efecte secundare.
Majoritatea exemplelor anterioare au folosit constante. În cazul în care argumentele sunt apeluri de funcții, ordinea în care sunt efectuate apelurile poate fi determinată de regulile de asociere, în funcție, desigur, de compilatorul dumneavoastră. Și dacă aceste funcții au efecte secundare ...
Știm cu toții că precedența este importantă, dar și asociativitatea este importantă în interpretarea semnificației unei expresii. Pentru o introducere foarte simplă, încercați Puterea operatorilor.