Přednost operátora C ++ a asociativita

V tomto kurzu se pomocí příkladů dozvíme o prioritě a asociativitě operátorů v C ++.

Přednost operátorů C ++

Pokud je v jednom výrazu více operátorů, operace se nehodnotí současně. Operátoři s vyšší prioritou mají své operace vyhodnoceny jako první.

Uvažujme příklad:

 int x = 5 - 17 * 6; 

Zde má operátor násobení *vyšší prioritu než operátor odčítání -. 17 * 6Nejprve se tedy vyhodnotí.

Ve výsledku je výše uvedený výraz ekvivalentní

 int x = 5 - (17 * 6);

Pokud si přejeme nejprve vyhodnotit 5 - 17, musíme je uzavřít do závorek :

 int x = (5 - 17) * 6;

Příklad 1: Přednost operátorů

 #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ýstup

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

Poznámka: Protože v C ++ existuje spousta operátorů s více úrovněmi priority, je velmi doporučeno používat závorky, aby byl náš kód čitelnější.

Tabulka priorit operátorů C ++

Následující tabulka (převzatá z cppreference.com) ukazuje přednost operátorů C ++. Úroveň priority 1 označuje operátory s nejvyšší prioritou, zatímco úroveň priority 17 znamená operátory s nejnižší prioritou.

Vlastnost asociativity bude brzy diskutována.

Přednost Operátor Popis Asociativita
1 :: Řešení rozsahu Zleva do prava
2 a ++
a--
type ()
type ()
a ()
a ()
.
->
Přírůstek
přípony / postfixu Snížení přípony / postfixu
Funkce přetypování
Funkce přetypování
Volání funkce Dolní
index
Přístup členů z objektu
Přístup členů z objektu ptr
Zleva do prava
3 ++ a
--a
+ a
-a
!
~
(type)
* a
&
sizeof
co_await
new new ()
delete delete ()
Přírůstek
předpony
Snížení předpony Unární plus
Unární mínus
Logické NOT
Bitové operace NOT
C cast cast
Indirection (dereference)
Address-of
Size-of
await-expression
Dynamické přidělování
paměti Dynamické přidělení paměti
Zprava doleva
4 . *
-> *
Výběr objektu
člena Výběr ukazatele člena
Zleva do prava
5 a * b
a / b
a% b
Modul multiplikačního
dělení
Zleva do prava
6 a + b
a - b

Odčítání sčítání
Zleva do prava
7 <<
>>
Bitový posun vlevo
Bitový posun vpravo
Zleva do prava
8 <= < Operátor třícestného srovnání Zleva do prava
9 <
<=
>
> =
Méně než
Méně než nebo rovno
Větší než
Větší než nebo rovno
Zleva do prava
10 ==
! =
Rovná se
Nerovná se
Zleva do prava
11 & Bitové AND Zleva do prava
12 ^ Bitový XOR Zleva do prava
13 | Bitové NEBO Zleva do prava
14 && Logické AND Zleva do prava
15 || Logické NEBO Zleva do prava
16 a? b: c
házet
co_yield
=
+ =
- =
* =
/ =
% =
<< =
>> =
& =
=
| =
Ternární výraz výnosu
operátoru podmíněného hodu
(C ++ 20)
Přiřazení
Přidání Přiřazení
Odčítání Přiřazení
Násobení Přiřazení
divize Přiřazení
Modul Přiřazení
Bitové Shift Levé přiřazení
Bitové Shift Doprava Přiřazení
Bitové A přiřazení
Bitové XOR Přiřazení
Bitové NEBO Přiřazení
Zprava doleva
17 , Operátor čárky Zleva do prava

A ++ asociativita operátorů

Asociativita operátoru je směr, ze kterého je výraz vyhodnocen. Například,

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

Podívejte se na a = 4;prohlášení. Asociativita =operátora je zprava doleva. Proto je hodnota b přiřazena a, a ne v opačném směru.

Rovněž více operátorů může mít stejnou prioritu (jak vidíme z výše uvedené tabulky). Když se ve výrazu použije více operátorů stejné úrovně priority, vyhodnotí se podle jejich asociativity .

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

Operátoři +=i -=operátoři mají stejnou přednost. Vzhledem k tomu, že asociativita těchto operátorů je zprava doleva, je zde vyhodnocen poslední příkaz.

  • a -= 6je vyhodnocen jako první. Proto bude -5
  • Poté b += -5bude vyhodnocen. Proto b bude -1

Příklad 2: Asociativita operátorů

 #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ýstup

 a = -5 b = -1

Zajímavé články...