W tym samouczku dowiemy się o pierwszeństwie i skojarzeniu operatorów w C ++ na podstawie przykładów.
Pierwszeństwo operatorów C ++
Jeśli w jednym wyrażeniu znajduje się wiele operatorów, operacje nie są oceniane jednocześnie. Zamiast tego operatory o wyższym priorytecie są najpierw oceniane.
Rozważmy przykład:
 int x = 5 - 17 * 6; 
W tym przypadku operator mnożenia *ma wyższy priorytet niż operator odejmowania -. Dlatego 17 * 6jest oceniany jako pierwszy.
W rezultacie powyższe wyrażenie jest równoważne
 int x = 5 - (17 * 6);
Jeśli chcemy 5 - 17najpierw ocenić , musimy zamknąć je w nawiasach :
 int x = (5 - 17) * 6;
Przykład 1: Pierwszeństwo operatorów
 #include using namespace std; int main() ( // evaluates 17 * 6 first int num1 = 5 - 17 * 6; // equivalent expression to num1 int num2 = 5 - (17 * 6); // forcing compiler to evaluate 5 - 17 first int num3 = (5 - 17) * 6; cout << "num1 = " << num1 << endl; cout << "num2 = " << num2 << endl; cout << "num3 = " << num3 << endl; return 0; )
Wynik
num1 = -97 num2 = -97 num3 = -72
Uwaga: Ponieważ w C ++ istnieje wiele operatorów o wielu poziomach pierwszeństwa, zdecydowanie zalecamy używanie nawiasów, aby nasz kod był bardziej czytelny.
Tabela pierwszeństwa operatorów C ++
Poniższa tabela (zaczerpnięta z cppreference.com) przedstawia pierwszeństwo operatorów C ++. Poziom pierwszeństwa 1 oznacza operatorów o najwyższym priorytecie, podczas gdy poziom pierwszeństwa 17 oznacza operatorów o najniższym priorytecie.
Własność asocjatywności zostanie omówiona wkrótce.
| Precedens | Operator | Opis | Łączność | 
|---|---|---|---|
| 1 | :: | Rozdzielczość zakresu | Z lewej na prawą | 
| 2 | a ++ a-- type () type () a () a () . ->  |  Przyrostek / postfix przyrost przyrostek / postfix ubytek Funkcja obsada obsada Funkcja Wywołanie funkcji Indeks dostępu użytkownika z obiektu dostępu państw Address ptr  |  Z lewej na prawą | 
| 3 | ++ a --a + a -a ! ~ (typ) * a & a sizeof co_await new new () delete delete ()  |  Przyrost prefiksu Zmniejszenie prefiksu Jednoargumentowe plus jednoargumentowe minus Rzutowanie w stylu logicznym NIE bitowym NOT C Kierunek (wyłuskiwanie) Adres- rozmiaru -wyrażenia oczekiwania Dynamiczna alokacja pamięci Dynamiczne zwalnianie pamięci  |  Od prawej do lewej | 
| 4 | . * -> *  |  Selektor obiektu członkowskiego Selektor wskaźnika elementu członkowskiego  |  Z lewej na prawą | 
| 5 | a * b a / b a% b  |  Moduł dzielenia mnożenia  |  Z lewej na prawą | 
| 6 | a + b a - b  |  Dodawanie Odejmowanie  |  Z lewej na prawą | 
| 7 | << >>  |  Przesunięcie bitowe w lewo Przesunięcie bitowe w prawo  |  Z lewej na prawą | 
| 8 | <= < | Operator porównania trójstronnego | Z lewej na prawą | 
| 9 | < < > > =  |  Mniejsze niż Mniejsze niż lub równe Większe niż Większe niż lub równe  |  Z lewej na prawą | 
| 10 | == ! =  |  Równe do Nie równe  |  Z lewej na prawą | 
| 11 | & | Bitowe i | Z lewej na prawą | 
| 12 | ^ | Bitowe XOR | Z lewej na prawą | 
| 13 | | | Bitowe OR | Z lewej na prawą | 
| 14 | && | Logiczne AND | Z lewej na prawą | 
| 15 | || | Logiczne LUB | Z lewej na prawą | 
| 16 | a? b: c rzut co_yield = + = - = * = / = % = << = >> = & = = | =  |  Ternary Conditional throw operator yield expression (C ++ 20) Przypisanie Dodawanie Przypisanie Odejmowanie Przypisanie Mnożenie Przypisanie działów Przypisanie modułu Przesunięcie bitowe Przypisanie w lewo Przesunięcie bitowe Przypisanie w prawo Przypisanie bitowe AND Przypisanie Bitowe Przypisanie XOR Bitowe LUB Przypisanie  |  Od prawej do lewej | 
| 17 | , | Operator przecinka | Z lewej na prawą | 
Kojarzenie operatorów C ++
Asocjatywność operatorów to kierunek, z którego jest oceniane wyrażenie. Na przykład,
 int a = 1; int b = 4; // a will be 4 a = b;
Spójrz na a = 4;oświadczenie. Asocjatywność =operatora jest od prawej do lewej. Stąd wartość b jest przypisana do a, a nie w drugą stronę.
Ponadto wiele operatorów może mieć ten sam poziom pierwszeństwa (jak widać w powyższej tabeli). Gdy w wyrażeniu jest używanych wiele operatorów o tym samym poziomie pierwszeństwa, są one oceniane zgodnie z ich asocjatywnością .
 int a = 1; int b = 4; b += a -= 6;
Zarówno operatorzy, jak +=i -=operatorzy mają ten sam priorytet. Ponieważ asocjatywność tych operatorów przebiega od prawej do lewej, oto jak jest obliczana ostatnia instrukcja.
a -= 6jest oceniany jako pierwszy. Stąd a będzie -5- Następnie 
b += -5zostaną ocenione. Stąd b będzie równe -1 
Przykład 2: Asocjatywność operatorów
 #include using namespace std; int main() ( int a = 1; int b = 4; // a -= 6 is evaluated first b += a -= 6; cout << "a = " << a << endl; ; cout << "b = " << b; )
Wynik
a = -5 b = -1








