Ebben az oktatóanyagban példák segítségével megismerhetjük a C ++ operátorok elsőbbségét és asszociativitását.
C ++ Operátorok elsőbbsége
Ha egyetlen kifejezésben több operátor van, akkor a műveleteket nem értékelik egyidejűleg. Inkább a magasabb prioritású üzemeltetőknek értékelik először működésüket.
Vegyünk egy példát:
int x = 5 - 17 * 6;
Itt a szorzási operátor *
magasabb szintű elsőbbségű, mint a kivonási operátor -
. Ezért 17 * 6
először értékelik.
Ennek eredményeként a fenti kifejezés ekvivalens a
int x = 5 - (17 * 6);
Ha 5 - 17
először értékelni szeretnénk, zárójelbe kell tennünk őket :
int x = (5 - 17) * 6;
1. példa: Operátorok elsőbbsége
#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; )
Kimenet
num1 = -97 num2 = -97 num3 = -72
Megjegyzés: Mivel a C ++ - ban sok olyan operátor van, akiknek több elsőbbségi szintje van, ezért erősen ajánlott zárójeleket használni a kódunk olvashatóbbá tételéhez.
C ++ Operátorok elsőbbségi táblázata
Az alábbi (a cppreference.com webhelyről vett) táblázat a C ++ operátorok elsőbbségét mutatja be. Az 1. prioritási szint a legmagasabb prioritású operátorokat, míg a 17. prioritási szint a legalacsonyabb prioritású operátorokat jelöli.
Az asszociativitás tulajdonsága hamarosan megvitatásra kerül.
Elsőbbség | Operátor | Leírás | Asszociativitás |
---|---|---|---|
1 | :: | Hatály felbontása | Balról jobbra |
2 | a ++ a-- type () type () a () a () . -> | Utótag / postfix növekmény Utótag / postfix dekrement Funkció szereplő Funkció cast Funkció hívás Subscript Tag hozzáférés egy objektumtól Tag hozzáférés az objektumtól ptr | Balról jobbra |
3 | ++ a --a + a -a ! ~ (Típus) * a & a sizeof co_await új új () Törlés () | Prefix increment Prefix decrement Unary plus Unary mínusz Logical NOT Bitwise NOT C style cast Irányelvűség (dereference) A wait-expresszió méretének címe Dinamikus memória-allokáció Dinamikus memória-elosztás | Jobbról balra |
4 | . * -> * | Tag-objektumválasztó Tag-mutatóválasztó | Balról jobbra |
5. | a * b a / b a% b | Szorzás osztás modul | Balról jobbra |
6. | a + b a - b | Amellett, kivonás | Balról jobbra |
7 | << >> | Balra balra tolás Balra jobbra tolásra | Balról jobbra |
8. | <= < | Háromirányú összehasonlító operátor | Balról jobbra |
9. | < <= > > = | Kevesebb, mint Kevesebb vagy egyenlő Nagyobb, mint Nagyobb vagy egyenlő | Balról jobbra |
10. | == ! = | Egyenlő: Nem egyenlő | Balról jobbra |
11. | & | Bitenkénti ÉS | Balról jobbra |
12. | ^ | Bitenként XOR | Balról jobbra |
13. | | | Bitenként VAGY | Balról jobbra |
14 | && | Logikai ÉS | Balról jobbra |
15 | || | Logikai VAGY | Balról jobbra |
16. | a? b: c dobja co_yield = + = - = * = / = % = << = >> = & = = | = | Háromszoros feltételes dobás operátor hozamkifejezése (C ++ 20) Hozzárendelés összeadása Hozzárendelés Kivonás hozzárendelése Szorzás Hozzárendelés Osztály hozzárendelés Modul hozzárendelés Bitenként eltolás Bal bal hozzárendelés Bitenként Váltás Jobb hozzárendelés bitenként ÉS Hozzárendelés Bitenként XOR hozzárendelés Bitenként VAGY hozzárendelés | Jobbról balra |
17. | , | Vessző operátor | Balról jobbra |
C ++ Operátorok asszociativitása
Az operátor asszociativitása az az irány , ahonnan egy kifejezést értékelünk. Például,
int a = 1; int b = 4; // a will be 4 a = b;
Vessen egy pillantást a a = 4;
nyilatkozatra. Az =
operátor asszociativitása jobbról balra történik. Ennélfogva a b értéke a-hoz van rendelve, és nem a másik irányba.
Ezenkívül több operátornak is lehet ugyanaz az elsőbbségi szintje (amint azt a fenti táblázatból láthatjuk). Ha egy kifejezésben ugyanazon elsőbbségi szint több operátora van, asszociativitásuk alapján értékelik őket .
int a = 1; int b = 4; b += a -= 6;
Az operátoroknak +=
és az -=
üzemeltetőknek is ugyanaz az elsőbbségük. Mivel ezeknek az operátoroknak az asszociativitása jobbról balra halad, a következőképpen értékeljük az utolsó állítást.
a -= 6
értékelik először. Ezért a lesz -5- Ezután
b += -5
értékelik. Ennélfogva b értéke -1
2. példa: Operátorok asszociativitása
#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; )
Kimenet
a = -5 b = -1