Prednosť a asociatívnosť operátorov v C ++

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 * 6sa 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 -= 6sa hodnotí ako prvý. Preto bude -5
  • Potom b += -5bude 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

Zaujímavé články...