C ++ operaatori eelistamine ja assotsiatiivsus

Selles õpetuses õpime näidete abil C ++ operaatorite ülimuslikkust ja assotsiatiivsust.

C ++ operaatorite ülimuslikkus

Kui ühes avaldises on mitu operaatorit, ei hinnata toiminguid samaaegselt. Pigem hinnatakse kõigepealt kõrgema tähtsusega ettevõtjate tegevust.

Vaatleme näiteks:

 int x = 5 - 17 * 6; 

Siin on korrutamisoperaator *kõrgema tasemega kui lahutamise operaator -. Seega 17 * 6hinnatakse kõigepealt.

Selle tulemusena on ülaltoodud avaldis samaväärne

 int x = 5 - (17 * 6);

Kui soovime kõigepealt hinnata 5 - 17, peame need sulgudesse lisama :

 int x = (5 - 17) * 6;

Näide 1: Operaatorite ülimuslikkus

 #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äljund

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

Märkus. Kuna C ++ -s on palju operaatoreid, kellel on mitu prioriteetsuse astet, on tungivalt soovitatav kasutada koodi sulguvaks muutmiseks sulge .

C ++ operaatorite tähtsuse tabel

Järgmine tabel (võetud aadressilt cppreference.com) näitab C ++ operaatorite ülimuslikkust. 1. prioriteeditase tähistab kõrgeima prioriteediga operaatoreid, 17. prioriteeditase aga madalaima prioriteediga operaatoreid.

Assotsiatiivsuse omadust arutatakse peagi.

Ülimuslikkus Operaator Kirjeldus Assotsiatiivsus
1 :: Reguleerimisala eraldusvõime Vasakult paremale
2 a ++
a--
tüüp ()
tüüp ()
a ()
a ()
.
->
Sufiks / järelliide juurdekasv
Sufiks / järelliide vähenemine
Funktsioon ülekandmine
Funktsioon ülekanne
Funktsioonikõne
Alaindeks
Liikme juurdepääs objektilt
Liikme juurdepääs objektilt ptr
Vasakult paremale
3 ++ a
--a
+ a
-a
!
~
(Tüüp)
* Seda
& V
Sizeof
co_await
uus uus ()
Kustuta Kustuta ()
Eesliide juurdekasvu
Eesliide aland
Unaarsed pluss
Unaarsed miinus
Loogiline NOT
Bitikaupa EI
C stiilis enamus
Indirection (dereference)
Aadress-of
Suurus-of
salasepitsus-ekspressiooni
Dünaamiline mälu eraldamise
Dünaamiline mälu deallocation
Paremalt vasakule
4 . *
-> *
Liikme objekti valija
Liikme kursori valija
Vasakult paremale
5 a * b
a / b
a% b
Korrutades
Division
Taivutusvetolujuus
Vasakult paremale
6 a + b
a - b
Liitmise
lahutamine
Vasakult paremale
7 <<
>>
Pikk vasakpoolne nihe
Pöördega paremale paremale
Vasakult paremale
8 <= < Kolmesuunaline võrdlusoperaator Vasakult paremale
9 <
<=
>
> =
Vähem kui
väiksem või võrdne
Suurem kui
suurem või võrdne
Vasakult paremale
10 ==
! =
Võrdne väärtusega
Pole võrdne
Vasakult paremale
11 & Pikkade kaupa JA Vasakult paremale
12 ^ Piki XOR Vasakult paremale
13 | Piki VÕI Vasakult paremale
14 && Loogiline JA Vasakult paremale
15 || Loogiline VÕI Vasakult paremale
16 a? b: c
viska
saagis
=
+ =
- =
* =
/ =
% =
<< =
>> =
& =
=
| =
Kolmekomponendiliste tingimuslik
visata operaator
saagis ekspressiooni (C ++ 20)
Ülesanne
Lisa Ülesanne
Lahutamine Ülesanne
Korrutamine Ülesanne
osakonna Ülesanne
Moodul Ülesanne
Bitikaupa Shift Left Ülesanne
Bitikaupa Shift Right Ülesanne
Bitikaupa ja loovutamine
Bitikaupa XOR Ülesanne
Bitikaupa või üleandmise
Paremalt vasakule
17 , Komaoperaator Vasakult paremale

C ++ Operaatorite assotsiatiivsus

Operaatori assotsiatiivsus on suund , kust avaldist hinnatakse. Näiteks,

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

Heitke pilk a = 4;avaldusele. =Operaatori assotsiatiivsus on paremalt vasakule. Seega omistatakse b väärtus a-le, mitte teises suunas.

Samuti võib mitmel operaatoril olla sama prioriteet (nagu näeme ülaltoodud tabelist). Kui avaldises kasutatakse mitut sama prioriteeditasemega operaatorit, hinnatakse neid vastavalt nende assotsiatiivsusele .

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

Nii operaatoritel +=kui -=operaatoritel on sama ülimuslikkus. Kuna nende operaatorite assotsiatiivsus on paremalt vasakule, siis siin hinnatakse viimast lauset.

  • a -= 6hinnatakse kõigepealt. Seega saab a -5
  • Siis b += -5hinnatakse. Seega saab b väärtuseks -1

Näide 2: Operaatorite assotsiatiivsus

 #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äljund

 a = -5 b = -1

Huvitavad Artiklid...