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 * 6
prvo se ocjenjuje.
Kao rezultat, gornji izraz je ekvivalentan
int x = 5 - (17 * 6);
Ako 5 - 17
prvo ž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 -= 6
prvo 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