Š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 * 6
pirmiausia įvertinamas.
Dėl to aukščiau pateikta išraiška yra lygiavertė
int x = 5 - (17 * 6);
Jei norime įvertinti 5 - 17
pirmiausia, 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 -= 6
yra įvertinamas pirmiausia. Vadinasi, a bus -5- Tada
b += -5
bus į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