Asocijativnost operatora

U programskim jezicima, asocijativnost (ili fiksnost) od operatora je osobina koja određuje kako su operatori istog prvenstva grupisani u odsustvu zagrada. Ako je operand i praćen i sledi operatere (na primer, "^4^") , i ti operateri imaju jednaku prednost, onda operand može da se koristi kao ulaz za dve različite operacije (odnosno dve operacije koje navode dva operatera). Izbor koja operacija da se primeni na operandu, određena je "asocijativnošću " operatera. Operateri mogu biti asocijativni (što znači operacije mogu da se grupišu proizvoljno), levo-asocijativni (što znači operacije su grupisane sa leve strane), desno-asocijativna (što znači operacije su grupisane sa desne strane) ili ne-asocijativna (što znači operacija ne može biti okovana, često zato što tip izlaza nije u skladu sa vrstama koje su ulazne). Asocijativnost i prednost operatora su deo definicije programskog jezika; različiti programski jezici mogu imati različite asocijativnosti i prioritete za iste vrste operatera.

Razmotriti izraz a ~ b ~ c. Ako operator ~ ima levu asocijativnost, ovaj izraz bi bio predstavljen kao (a ~ b) ~ c. Ako operator ima desnu asocijativnost, izraz bi bio predstavljen kao a ~ (b ~ c). Ako operator je ne asocijativan, izraz će imati sintaksnu grešku, ili će imati neko posebno značenje. Neki matematički operateri imaju inherentnu asocijativnost. Na primer, oduzimanje i deljenje, kao što se koristi u konvencionalnoj matematičkoj notaciji, su inherentni levo-asocijativno. Sabiranje i množenje, s druge strane, nemaju svojstvenu asocijativnost, iako je većina programskih jezika definisala asocijativnost za ove operacije. 

Mnoga uputstva programskih jezika pružaju tabelu prvenstva i asocijativnost operatera; vidi, na primer, tabela za C i C ++

Koncept notne asocijativnosti ovde opisan je vezan za, ali se razlikuje od matematičke asocijativnost. Operacija koja je matematički asocijativna, po definiciji ne zahteva oznaku upozorenja asocijativnosti. (Na primer, sabiranje ima svojstvo asocijativnosti, tako da ne mora da bude ni levo asocijativno ili desno asocijativno.) Na operaciju koja nije matematički asocijativna, međutim, mora biti dodato levo, desno, ili ne- asocijativna. ( Na primer, oduzimanje nema svojstvo asocijativnosti, stoga mora imati oznaka upozorenja asocijativnost.) 

Primeri uredi

Asocijativnost je jedino potrebna kada operateri imaju i izrazu imaju istu prednost. Često + i - imaju istu prednost. Razmotrite izraz 7 − 4 + 2. Rezultat može biti ili (7 − 4) + 2 = 5 ili 7 − (4 + 2) = 1. Bivši rezultat odgovara slučaju kada + i  su levo-asocijativni, Ovo poslednje kada su  + i - desno asocijativni.

Kako bi se izrazila normalne upotreba, sabiranje, oduzimanje, množenje i deljenje su obično levo asocijativni[1], dok stepenovanje (ako postoji) je desno asocijativno;[1] ovo se odnosi na knutovu notaciju. Bilo koji operatori dodele su obično desno-asocijativni. Da biste sprečili slučajeve u kojima bi operandi bili povezani sa dva operatera, ili bez operatera uopšte, operateri sa istim prvenstvom moraju imati istu asocijativnost. 

Detaljan primer uredi

Razmislite o izrazu 5^4^3^2, u kojem ^ predstavlja stepenovanje. Čitanje sleva nadesno će primeniti pravilo asocijativnosti na deo, zbog desne-asocijativnosti ^, na sledeći način:

  1. Član 5 je pročitan.
  2. Neterminal ^ je pročitan. Čvor: "5^".
  3. Član4 je pročitan. Čvor: "5^4".
  4. Neterminal^ je pročitan, što je izazvalo pravilo desne asocijativnosti. Asocijativnost odlučuje čvor: "5^(4^".
  5. Član3 je pročitan. Čvor: "5^(4^3".
  6. Neterminal ^ je pročitan, izazivajući ponovnu primenu pravila desne asocijativnosti. Čvor"5^(4^(3^".
  7. Član2 je pročitan. Čvor"5^(4^(3^2".
  8. Nema tokena za čitanje. Nanesite asocijativnost za proizvodnju drveta za izvođenje "5^(4^(3^2))".

Ovo može biti procenjeno dubinom-prvog, sa početkom sa vrha čvora (prvo ^):

  1. Evaluator hoda dole niz drvo, polazeći od prvog, preko drugog, do trećeg  ^ izraza.
  2. Ocenjuje kao: 32 = 9. Rezultat zamenjuje granu izraza kao drugi operand na drugom ^.
  3. Evaluacija se nastavlja dalje jedan nivo nagore na drvo izvođenja kao: 49 = 262144. Opet, rezultat zamenjuje granu izraza kao drugi operand prvog  ^.
  4. Opet, evaluator korača na drvo do izraza korena i ocenjuje kao: 5262144 ≈ 6.2060699 × 10183230. Poslednje preostale grane padaju i rezultat postaje ukupan rezultat, dakle završetak ukupne ocene.

Evaluacija levo-asocijativna bi dovela u drvo izvođenja  ((5^4)^3)^2 i do potpuno drugog rezultata 625, 244140625 i konačno ~5.9604645 × 1016.

Desno-asocijativni zadatak operacija uredi

U mnogim imperativnim programiranjima, zadatak operatera se definiše da je desno-asocijativan, a zadatak je definisan tako da bude izraz (sa vrednošću), ne samo izjava. Ovo omogućava okovan zadatak pomoću vrednosti jednog izraza zadatka kao ulaza (desnog operanda) od sledećeg.

Na primer, u C, zadatak a = bje izraz koji vraća vrednost ( b konvertovanu na tip a) sa nespojivim podešavanjima a na ovu vrednost.[a] Zadatak može biti predstavljen usred izraza. Desno-asocijatvni operater = dozvoljava izraze kao što su a = b = c da budu predstavljeni kao a = (b = c), time postavljanje i  a i b na vrednost c. U C, alternativno (a = b) = c nema smisla jer a = b nije L-vrednost nego samo r vrednost. Međutim u C++ zadatak a = b vraća vrednost koja se odnosi na levi termin u zadatku. Dakle (a = b) = c može biti predstavljeno kao a = b; a = c;.

Ne-asocijativne operacije uredi

Ne-asocijativni operateri su operateri koji nemaju definisano ponašanje kada koriste sekvence u izrazima. U prologu operater :- je ne-asocijativan jer konstrukcija kao što je "a :- b :- c" konstituiše sintaksne greške.

 Druga mogućnost je da se sekvence pojedinih operatera tumače na neki drugi način, koji se ne može izraziti kao asocijativnost. Ovo obično znači da sintaktički, postoje posebna pravila za sekvence ovih operacija, i semantički ponašanje je drugačije. Dobar primer je Pajton, koji ima nekoliko takvih konstrukcija.[2] Pošto su dodele iskazi, a ne operacije, operater dodele nema vrednost i nije asocijativan. Umesto toga, sprovedena je Ulančana dodela jer postoje gramatička pravila za nizove dodela a = b = c, koji se zatim dodeljuje sleva nadesno. Dalje, kombinacije dodela i pojedinačnih dodela, kao a = b += c nisu dozvoljeni u Pajtonu, iako su dozboljeni u C. Drugi primer su operateri poređenja, kao što su >, ==, i  <=. Ulančano poređenje kao a < b < c je predstavljeno kao (a < b) и (b < c), nije jednako ni (a < b) < c ili a < (b < c).[2]

Vidi još uredi

Napomene uredi

  1. ^ An expression can be made into a statement by following it with a semicolon; i.e. a = b is an expression but a = b; is a statement.

Reference uredi

  1. ^ a b Bronstein, Ilja Nikolaevič; Semendjajew, Konstantin Adolfovič (1987) [1929]. "2.4.1.1."
  2. ^ a b The Python Language Reference, "6.