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.

T.R. Werner, 23 lutego 2019; 23:59