Асоцијативност оператора

С Википедије, слободне енциклопедије
Пређи на навигацију Пређи на претрагу

У програмским језицима, асоцијативност (или фиксност) од оператора је особина која одређује како су оператори истог првенства груписани у одсуству заграда. Ако је операнд и праћен и следи оператере (на пример, "^4^") , и ти оператери имају једнаку предност, онда операнд може да се користи као улаз за две различите операције (односно две операције које наводе два оператера). Избор која операција да се примени на операнду, одређена је "асоцијативношћу " оператера. Оператери могу бити асоцијативни (што значи операције могу да се групишу произвољно), лево-асоцијативни (што значи операције су груписане са леве стране), десно-асоцијативна (што значи операције су груписане са десне стране) или не-асоцијативна (што значи операција не може бити окована, често зато што тип излаза није у складу са врстама које су улазне). Асоцијативност и предност оператора су део дефиниције програмског језика; различити програмски језици могу имати различите асоцијативности и приоритете за исте врсте оператера.

Размотрити израз a ~ b ~ c. Ако оператор ~ има леву асоцијативност, овај израз би био представљен као (a ~ b) ~ c. Ако оператор има десну асоцијативност, израз би био представљен као a ~ (b ~ c). Ако оператор је не асоцијативан, израз ће имати синтаксну грешку, или ће имати неко посебно значење. Неки математички оператери имају инхерентну асоцијативност. На пример, одузимање и дељење, као што се користи у конвенционалној математичкој нотацији, су инхерентни лево-асоцијативно. Сабирање и множење, с друге стране, немају својствену асоцијативност, иако је већина програмских језика дефинисала асоцијативност за ове операције. 

Многа упутства програмских језика пружају табелу првенства и асоцијативност оператера; види, на пример, табела за C и C ++

Концепт нотне асоцијативности овде описан је везан за, али се разликује од математичке асоцијативност. Операција која је математички асоцијативна, по дефиницији не захтева ознаку упозорења асоцијативности. (На пример, сабирање има својство асоцијативности, тако да не мора да буде ни лево асоцијативно или десно асоцијативно.) На операцију која није математички асоцијативна, међутим, мора бити додато лево, десно, или не- асоцијативна. ( На пример, одузимање нема својство асоцијативности, стога мора имати ознака упозорења асоцијативност.) 

Примери[уреди | уреди извор]

Асоцијативност је једино потребна када оператери имају и изразу имају исту предност. Често + и - имају исту предност. Размотрите израз 7 − 4 + 2. Резултат може бити или (7 − 4) + 2 = 5 или 7 − (4 + 2) = 1. Бивши резултат одговара случају када + и  су лево-асоцијативни, Ово последње када су  + и - десно асоцијативни.

Како би се изразила нормалне употреба, сабирање, одузимање, множење и дељење су обично лево асоцијативни[1], док степеновање (ако постоји) је десно асоцијативно;[1] ово се односи на кнутову нотацију. Било који оператори доделе су обично десно-асоцијативни. Да бисте спречили случајеве у којима би операнди били повезани са два оператера, или без оператера уопште, оператери са истим првенством морају имати исту асоцијативност. 

Детаљан пример[уреди | уреди извор]

Размислите о изразу 5^4^3^2, у којем ^ представља степеновање. Читање слева надесно ће применити правило асоцијативности на део, због десне-асоцијативности ^, на следећи начин:

  1. Члан 5 је прочитан.
  2. Нетерминал ^ је прочитан. Чвор: "5^".
  3. Члан4 је прочитан. Чвор: "5^4".
  4. Нетерминал^ је прочитан, што је изазвало правило десне асоцијативности. Асоцијативност одлучује чвор: "5^(4^".
  5. Члан3 је прочитан. Чвор: "5^(4^3".
  6. Нетерминал ^ је прочитан, изазивајући поновну примену правила десне асоцијативности. Чвор"5^(4^(3^".
  7. Члан2 је прочитан. Чвор"5^(4^(3^2".
  8. Нема токена за читање. Нанесите асоцијативност за производњу дрвета за извођење "5^(4^(3^2))".

Ово може бити процењено дубином-првог, са почетком са врха чвора (прво ^):

  1. Евалуатор хода доле низ дрво, полазећи од првог, преко другог, до трећег  ^ израза.
  2. Оцењује као: 32 = 9. Резултат замењује грану израза као други операнд на другом ^.
  3. Евалуација се наставља даље један ниво нагоре на дрво извођења као: 49 = 262144. Опет, резултат замењује грану израза као други операнд првог  ^.
  4. Опет, евалуатор корача на дрво до израза корена и оцењује као: 5262144 ≈ 6.2060699 × 10183230. Последње преостале гране падају и резултат постаје укупан резултат, дакле завршетак укупне оцене.

Евалуација лево-асоцијативна би довела у дрво извођења  ((5^4)^3)^2 и до потпуно другог резултата 625, 244140625 и коначно ~5.9604645 × 1016.

Десно-асоцијативни задатак операција[уреди | уреди извор]

У многим императивним програмирањима, задатак оператера се дефинише да је десно-асоцијативан, а задатак је дефинисан тако да буде израз (са вредношћу), не само изјава. Ово омогућава окован задатак помоћу вредности једног израза задатка као улаза (десног операнда) од следећег.

На пример, у C, задатак a = bје израз који враћа вредност ( b конвертовану на тип a) са неспојивим подешавањима a на ову вредност.[a] Задатак може бити представљен усред израза. Десно-асоцијатвни оператер = дозвољава изразе као што су a = b = c да буду представљени као a = (b = c), тиме постављање и  a и b на вредност c. У C, алтернативно (a = b) = c нема смисла јер a = b није Л-вредност него само р вредност. Међутим у C++ задатак a = b враћа вредност која се односи на леви термин у задатку. Дакле (a = b) = c може бити представљено као a = b; a = c;.

Не-асоцијативне операције[уреди | уреди извор]

Не-асоцијативни оператери су оператери који немају дефинисано понашање када користе секвенце у изразима. У прологу оператер :- је не-асоцијативан јер конструкција као што је "a :- b :- c" конституише синтаксне грешке.

 Друга могућност је да се секвенце појединих оператера тумаче на неки други начин, који се не може изразити као асоцијативност. Ово обично значи да синтактички, постоје посебна правила за секвенце ових операција, и семантички понашање је другачије. Добар пример је Пајтон, који има неколико таквих конструкција.[2] Пошто су доделе искази, а не операције, оператер доделе нема вредност и није асоцијативан. Уместо тога, спроведена је Уланчана додела јер постоје граматичка правила за низове додела a = b = c, који се затим додељује слева надесно. Даље, комбинације додела и појединачних додела, као a = b += c нису дозвољени у Пајтону, иако су дозбољени у C. Други пример су оператери поређења, као што су >, ==, и  <=. Уланчано поређење као a < b < c је представљено као (a < b) и (b < c), није једнако ни (a < b) < c или a < (b < c).[2]

Види још[уреди | уреди извор]

Напомене[уреди | уреди извор]

  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.

Референце[уреди | уреди извор]

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