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 * 6
jest oceniany jako pierwszy.
W rezultacie powyższe wyrażenie jest równoważne
int x = 5 - (17 * 6);
Jeśli chcemy 5 - 17
najpierw 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 -= 6
jest oceniany jako pierwszy. Stąd a będzie -5- Następnie
b += -5
zostaną 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