Pierwszeństwo i łączność operatorów w języku C ++

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

Interesujące artykuły...