C ++ Operátor elsőbbség és asszociativitás

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 * 6először értékelik.

Ennek eredményeként a fenti kifejezés ekvivalens a

 int x = 5 - (17 * 6);

Ha 5 - 17elő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

érdekes cikkek...