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 * 6
hinnatakse 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 -= 6
hinnatakse kõigepealt. Seega saab a -5- Siis
b += -5
hinnatakse. 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