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 * 6
Nejprve 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 -= 6
je vyhodnocen jako první. Proto bude -5- Poté
b += -5
bude 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