C ++ operatoriaus pirmenybė ir asociatyvumas

Šioje pamokoje pavyzdžių pagalba sužinosime apie operatorių pirmenybę ir asociatyvumą C ++.

„C ++“ operatorių pirmenybė

Jei vienoje išraiškoje yra keli operatoriai, operacijos nevertinamos vienu metu. Atvirkščiai, operatoriai, turintys didesnę pirmenybę , pirmiausia įvertina savo veiklą.

Panagrinėkime pavyzdį:

 int x = 5 - 17 * 6; 

Čia daugybos operatorius *yra aukštesnio lygio pirmenybė nei atimties operatorius -. Taigi, 17 * 6pirmiausia įvertinamas.

Dėl to aukščiau pateikta išraiška yra lygiavertė

 int x = 5 - (17 * 6);

Jei norime įvertinti 5 - 17pirmiausia, turime juos pridėti skliaustuose :

 int x = (5 - 17) * 6;

1 pavyzdys: Operatorių pirmenybė

 #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; )

Rezultatas

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

Pastaba: Kadangi C ++ yra daug operatorių, turinčių kelis pirmenybės lygius, labai rekomenduojama naudoti skliaustus , kad mūsų kodas būtų lengviau įskaitomas.

C ++ operatorių pirmenybės lentelė

Šioje lentelėje (paimta iš cppreference.com) parodyta C ++ operatorių pirmenybė. 1 pirmenybės lygis reiškia aukščiausio lygio operatorius, o 17 prioritetas - žemiausio lygio operatorius.

Netrukus bus aptarta asociatyvumo savybė .

Pirmenybė operatorius apibūdinimas Asociatyvumas
1 :: Taikymo srities skiriamoji geba Iš kairės į dešinę
2 a ++
a--
type ()
type ()
a ()
a ()
.
->
Priesagos / postfix prieaugis
Priesagos / postfix mažinimas
Funkcijos perdavimas
Funkcijos perdavimas
Funkcijos iškvietimas
Subscript
Nario prieiga iš objekto
Nario prieiga iš objekto ptr
Iš kairės į dešinę
3 ++ a
--a
+ a
-a
!
~
(Tipas)
*
& A
Sizeof
co_await
nauja nauja ()
Ištrinti ()
Priešdėlis prieaugis
prefiksas Mažėja
Vienetinis plius
Vienetinis atėmus
Loginiai NE
Bitinis NE
C stiliaus mesti
Netiesiogiai (dereference)
Adresas-of
Dydis-apie
laukiame saviraiškos
Dinaminis atminties paskirstymas
Dinaminė atmintis deallocation
Iš dešinės į kairę
4 . *
-> *
Nario objekto parinkiklis
Nario rodyklės parinkiklis
Iš kairės į dešinę
5 a * b
a / b
a% b
Daugybos
padalijimo
modulis
Iš kairės į dešinę
6 a + b
a - b
papildymas
Atimtis
Iš kairės į dešinę
7 <<
>>
Kairysis kairysis poslinkis
Dešinysis dešinysis poslinkis
Iš kairės į dešinę
8 <= < Trijų krypčių palyginimo operatorius Iš kairės į dešinę
9 <
<=
>
> =
Mažesnė nei
mažesnė arba lygi
didesnei nei
didesnė nei lygi arba lygi
Iš kairės į dešinę
10 ==
! =
Lygu su
Nelygu
Iš kairės į dešinę
11 & Bitais IR Iš kairės į dešinę
12 ^ Bitais XOR Iš kairės į dešinę
13 | ARBA bitais Iš kairės į dešinę
14 && Loginis IR Iš kairės į dešinę
15 || Logiška ARBA Iš kairės į dešinę
16 a? b: c
mesti
bendro pelningumo
=
+ =
- =
* =
/ =
% =
<< =
>> =
& =
=
| =
Trišalio sąlyginio
metimo operatoriaus
išvesties išraiška (C ++ 20)
Priskyrimo
pridėjimo priskyrimo
atimties priskyrimo
daugybos priskyrimo
skyriaus priskyrimo
modulio priskyrimas
Bitų perkėlimas Kairės priskyrimas
Bitų perkėlimas dešinės priskyrimo
rutulys IR priskyrimas
Bitų XOR priskyrimas
bitų ARBA priskyrimas
Iš dešinės į kairę
17 , Kablelio operatorius Iš kairės į dešinę

„C ++“ operatorių asociatyvumas

Operatoriaus asociatyvumas yra kryptis, iš kurios vertinama išraiška. Pavyzdžiui,

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

Pažvelkite į a = 4;pareiškimą. =Operatoriaus asociatyvumas yra iš dešinės į kairę. Taigi b reikšmė priskiriama a, o ne kita kryptimi.

Be to, keli operatoriai gali turėti tą patį pirmenybės lygį (kaip matome iš aukščiau pateiktos lentelės). Kai išraiškoje naudojami keli to paties prioriteto lygio operatoriai, jie vertinami pagal jų asociatyvumą .

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

Tiek operatoriai, +=tiek -=operatoriai turi tą pačią pirmenybę. Kadangi šių operatorių asociatyvumas yra iš dešinės į kairę, štai kaip įvertinamas paskutinis teiginys.

  • a -= 6yra įvertinamas pirmiausia. Vadinasi, a bus -5
  • Tada b += -5bus įvertinta. Vadinasi, b bus -1

2 pavyzdys: Operatorių asociatyvumas

 #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; )

Rezultatas

 a = -5 b = -1

Įdomios straipsniai...