V tomto tutoriále sa pomocou príkladov dozvieme o prednosti a asociativite operátorov v C ++.
Prednosť operátorov C ++
Ak je v jednom výraze viac operátorov, operácie sa nevyhodnocujú súčasne. Skôr operátori s vyššou prednosťou majú najskôr vyhodnotené svoje operácie.
Pozrime sa na príklad:
int x = 5 - 17 * 6;
Tu má operátor násobenia *
vyššiu prioritu ako operátor odčítania -
. Preto 17 * 6
sa hodnotí ako prvý.
Vo výsledku je vyššie uvedený výraz ekvivalentný s
int x = 5 - (17 * 6);
Ak chceme najskôr vyhodnotiť 5 - 17
, musíme ich vložiť do zátvoriek :
int x = (5 - 17) * 6;
Príklad 1: Prednosť operátorov
#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; )
Výkon
num1 = -97 num2 = -97 num3 = -72
Poznámka: Pretože v C ++ existuje veľa operátorov s viacerými úrovňami priority, dôrazne sa odporúča používať zátvorky, aby bol náš kód čitateľnejší.
Tabuľka precedensov operátorov C ++
Nasledujúca tabuľka (prevzatá z cppreference.com) ukazuje prednosť operátorov C ++. Úroveň priority 1 označuje operátorov s najvyššou prioritou, zatiaľ čo úroveň priority 17 znamená operátorov s najnižšou prioritou.
O vlastnosti asociativity sa bude čoskoro diskutovať.
Prednosť | Prevádzkovateľ | Popis | Asociatívnosť |
---|---|---|---|
1 | :: | Rozsah pôsobnosti | Zľava doprava |
2 | a ++ a-- type () type () a () a () . -> | Prírastok prípony / postfixu Prírastok prípony / postfixu Funkčné obsadenie Funkčné obsadenie Volanie funkcie Dolný index Prístup člena z objektu Prístup člena z objektu ptr | Zľava doprava |
3 | ++ a --a + a -a ! ~ (typ) * a & veľkosť co_await new new () delete delete () | Prírastok prefixu Dekrement prefixu Unárne plus Unárne mínus Logické NIE Bitové NIE Netypické obsadenie v štýle C Indirection (dereference) Address-of Veľkosť-of -await-výraz Dynamické pridelenie pamäte Dynamické pridelenie pamäte | Zprava doľava |
4 | . * -> * | Selektor členských objektov Selektor ukazovateľa člena | Zľava doprava |
5 | a * b a / b a% b | Násobenie Divízia Modul | Zľava doprava |
6 | a + b a - b | prídavok odčítanie | Zľava doprava |
7 | << >> | Bitwise je vľavo posun Bitové posunutie vpravo | Zľava doprava |
8 | <= < | Operátor porovnávania v troch smeroch | Zľava doprava |
9 | < <= > > = | Menej ako menšie alebo rovné väčšie ako väčšie alebo väčšie ako | Zľava doprava |
10 | == ! = | Rovná sa Nerovná sa | Zľava doprava |
11 | & | Bitové AND | Zľava doprava |
12 | ^ | Bitový XOR | Zľava doprava |
13 | | | Bitové ALEBO | Zľava doprava |
14 | && | Logické AND | Zľava doprava |
15 | || | Logické ALEBO | Zľava doprava |
16 | a? b: c hod co_yield = + = - = * = / = % = << = >> = & = = | = | Výnosový výraz operátora podmieneného hodu Ternary (C ++ 20) Priradenie Priradenie Priradenie Odčítanie Priradenie Oddelenie Násobenie Priradenie divízie Priradenie Modul Priradenie Bitové posunutie Ľavé priradenie Bitové posunutie vpravo Priradenie bitové AND Priradenie bitové XOR Priradenie bitové ALEBO priradenie | Zprava doľava |
17 | , | Operátor čiarky | Zľava doprava |
A ++ operatívnosť operátorov
Asociativita operátora je smer, z ktorého sa výraz vyhodnocuje. Napríklad,
int a = 1; int b = 4; // a will be 4 a = b;
Zoznámte sa s a = 4;
vyhlásením. Asociativita =
operátora je sprava doľava. Preto je hodnota b priradená k a, a nie v opačnom smere.
Rovnako viac operátorov môže mať rovnakú prioritu (ako vidíme z tabuľky vyššie). Keď sa vo výraze použije viac operátorov rovnakej úrovne priority, vyhodnotia sa podľa ich asociativity .
int a = 1; int b = 4; b += a -= 6;
Prevádzkovatelia +=
aj -=
prevádzkovatelia majú rovnakú prednosť. Pretože asociatívnosť týchto operátorov je sprava doľava, takto sa vyhodnocuje posledný výrok.
a -= 6
sa hodnotí ako prvý. Preto bude -5- Potom
b += -5
bude vyhodnotený. Preto b bude -1
Príklad 2: Asociativita operátorov
#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; )
Výkon
a = -5 b = -1