Prednost i asocijativnost operatora C ++

U ovom ćemo tutorijalu uz primjere naučiti o prednosti i asocijativnosti operatora u C ++-u.

Prednost operatora C ++

Ako postoji više operatora u jednom izrazu, operacije se ne vrednuju istovremeno. Umjesto toga, prvo se ocjenjuju operateri s većim prioritetom .

Razmotrimo primjer:

 int x = 5 - 17 * 6; 

Ovdje je operator množenja *prednost više razine od operatora oduzimanja -. Dakle, 17 * 6prvo se ocjenjuje.

Kao rezultat, gornji izraz je ekvivalentan

 int x = 5 - (17 * 6);

Ako 5 - 17prvo želimo procijeniti , moramo ih priložiti u zagrade :

 int x = (5 - 17) * 6;

Primjer 1: Prednost operatora

 #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; )

Izlaz

 num1 = -97 num2 = -97 num3 = -72

Napomena: Budući da u C ++-u postoji puno operatora s više razina prednosti, toplo se preporučuje da koristimo zagrade kako bismo naš kôd učinili čitljivijim.

Tablica prioriteta operatora C ++

Sljedeća tablica (preuzeta s cppreference.com) prikazuje prednost operatora C ++. Razina prvenstva 1 označava operatore najvišeg prioriteta, dok razina prioriteta 17 označava operatore najnižeg prioriteta.

O svojstvu asocijativnosti raspravljat će se uskoro.

Prednost Operater Opis Asocijativnost
1 :: Rezolucija opsega S lijeva nadesno
2 a ++
a--
type ()
type ()
a ()
a ()
.
->
Povećanje
sufiksa / postfiksa Sufiks / postfiks dekrecija
Funkcija cast
Funkcija cast
Funkcija poziv
Pretplata
Pristup člana s objekta
Pristup člana s objekta ptr
S lijeva nadesno
3 ++ a
--a
+ a
-a
!
~
(Tip)
* a
& A
sizeof
co_await
nova novi ()
Obriši Obriši ()
Inkrementiranje
prefiksa Umanjenje prefiksa Unary
plus
Unary minus
Logički NOT
Bitwise NOT
C cast cast
Indirection (dereference)
Address-of
Size-of
await-expression
Dinamička dodjela
memorije Dinamička dislokacija memorije
S desna na lijevo
4 . *
-> *
Odabir
člana člana Odabir pokazivača člana
S lijeva nadesno
5 a * b
a / b
a% b
Množenje
Odjel
modul
S lijeva nadesno
6 a + b
a - b
Zbrajanje
oduzimanje
S lijeva nadesno
7 <<
>>
Pomak u smjeru lijevog pomaka
Bitovni pomak udesno
S lijeva nadesno
8 <= < Trosmjerni operator usporedbe S lijeva nadesno
9 <
<=
>
> =
Manje od
Manje od ili jednako
Veće od
Veće ili jednako
S lijeva nadesno
10 ==
! =
Jednako s
Nije jednako sa
S lijeva nadesno
11 & Bitno I S lijeva nadesno
12 ^ Bitno XOR S lijeva nadesno
13 | Bitno ILI S lijeva nadesno
14 && Logično I S lijeva nadesno
15 || Logično ILI S lijeva nadesno
16 a? b: c
baciti
co_yield
=
+ =
- =
* =
/ =
% =
<< =
>> =
& =
=
| =
Ternarni uvjetni
operater bacanja
izraz prinosa (C ++ 20)
Dodjela
zadatka Dodjela Dodijeljivanje
Oduzimanje Dodjela
Umnožavanje Dodjela
Podjela
Modul dodjele Dodjela
Bitwise Shift lijeva dodjela
Bitwise Shift Desna dodjela
Bitwise I dodjela
Bitwise XOR Dodjela
Bitwise ILI Dodjela
S desna na lijevo
17 , Operator zarez S lijeva nadesno

Asocijativnost operatora C ++

Asocijativnost operatora je smjer iz kojeg se ocjenjuje izraz. Na primjer,

 int a = 1; int b = 4; // a will be 4 a = b;

Pogledajte a = 4;izjavu. Asocijativnost =operatora je zdesna nalijevo. Stoga je vrijednost b dodijeljena a, a ne u drugom smjeru.

Također, više operatora može imati istu razinu prednosti (kao što možemo vidjeti iz gornje tablice). Kad se u izrazu koristi više operatora iste razine prednosti, oni se vrednuju prema njihovoj asocijativnosti .

 int a = 1; int b = 4; b += a -= 6;

I operateri +=i -=operatori imaju isti prioritet. Budući da je asocijativnost ovih operatora zdesna nalijevo, evo kako se procjenjuje posljednja izjava.

  • a -= 6prvo se ocjenjuje. Stoga će a biti -5
  • Tada b += -5će se procijeniti. Stoga će b biti -1

Primjer 2: Udruživanje operatora

 #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; )

Izlaz

 a = -5 b = -1

Zanimljivi članci...