node58






9.1 Priorytety i wiązanie



























Dalej: 9.2 Przegląd operatorów
W górę: 9. Operatory
Wstecz: 9. Operatory






9.1 Priorytety i wiązanie



Zapis infiksowy, wygodny i naturalny dla ludzi, prowadzi
jednak do sytuacji, gdy z samego zapisu nie wynika kolejność
wykonania działań w złożonych wyrażeniach.
Na przykład w wyrażeniu
a + b / c

zmienna
b może być traktowana jako prawy
argument operatora dodawania albo lewy argument operatora
dzielenia. W pierwszym przypadku obliczymy (a + b)/c,
a w drugim
a . (b/c) otrzymując różny wynik.


Aby uniknąć tego rodzaju wieloznaczności, wprowadzono pojęcie
priorytetu
operatorów.
Według priorytetu operatory dzielą się na szereg grup, w ramach
których priorytety są jednakowe.
W sytuacjach, jak opisana powyżej, gdy to samo wyrażenie
może być potraktowane jako argument dwóch operatorów,
najpierw zostanie wykonana operacja opisywana przez ten z tych dwóch
operatorów który ma wyższy priorytet.
Jeśli natomiast oba mają ten sam priorytet, kolejność wykonywania
operacji będzie określona ich
wiązaniem:
od lewej do prawej dla operatorów o wiązaniu lewym
i od prawej do lewej dla operatorów o wiązaniu prawym.
Aby ta reguła nie prowadziła do sprzeczności, operatory
o takim samym priorytecie muszą mieć taki sam kierunek wiązania
(co w istocie zachodzi). A zatem w wyrażeniu
a + b / c

najpierw zostanie wykonane dzielenie, gdyż ma wyższy priorytet
od dodawania. Ale w wyrażeniu
a + b - c

najpierw zostanie wykonane dodawanie, gdyż ma ten sam priorytet
co odejmowanie, a oba operatory mają wiązanie lewe.


Dla operatora przypisania wiązanie jest prawe. Tak więc
w wyrażeniu
a=b=c przypisanie
b=c
wykonane zostanie najpierw, a jego wynik (wartość
b
po tej operacji) przypisany będzie do zmiennej
a.
Ale np. operator wyboru składowej („kropka'')
ma wiązanie lewe, zatem
obiekt.sklad1.sklad2 oznacza:
najpierw wybierz składową
sklad1 obiektu

obiekt, potem z wynikowego obiektu składową

sklad2.


Wszystkie prefiksowe (przedrostkowe) operatory jednoargumentowe
mają wiązanie prawe: najpierw działa operator z prawej
strony, czyli bliższy argumentu.
Tak więc
*++p to to samo co
*(++p),
natomiast
++*p to
++(*p), bo choć
przedrostkowy operator inkrementacji '
++' i operator
wyłuskania wartości (dereferencji) '
*' mają ten sam
priorytet, oba mają wiązanie prawe.













Dalej: 9.2 Przegląd operatorów
W górę: 9. Operatory
Wstecz: 9. Operatory



T.R. Werner, 24 wrzesnia
2007, godz. 22:51





Wyszukiwarka

Podobne podstrony:
node58 M2XD27CPXUYXABVNV4TU57FPNGW4DWEK34N7YSQ
node58
node58
node58
node58 XGJOGVSNVF7AFPOSQSQAX2ASC2OXUBC3E3OS2MY
node58

więcej podobnych podstron