Tässä opetusohjelmassa opitaan C ++ -operaattoreiden etusija ja assosiatiivisuus esimerkkien avulla.
C ++ -operaattoreiden etusija
Jos yhdessä lausekkeessa on useita operaattoreita, operaatioita ei arvioida samanaikaisesti. Pikemminkin etusijalla olevien toimijoiden toiminta arvioidaan ensin.
Tarkastellaanpa esimerkkiä:
int x = 5 - 17 * 6;
Tässä kertolaskuoperaattori *
on korkeamman tason etusijalla kuin vähennysoperaattori -
. Siksi 17 * 6
arvioidaan ensin.
Tämän seurauksena yllä oleva lauseke vastaa
int x = 5 - (17 * 6);
Jos haluamme arvioida 5 - 17
ensin, meidän on liitettävä ne sulkeisiin :
int x = (5 - 17) * 6;
Esimerkki 1: Operaattoreiden etusija
#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; )
Tuotos
num1 = -97 num2 = -97 num3 = -72
Huomaa: Koska C ++ --järjestelmässä on paljon operaattoreita, joilla on useita etusijatasoja, on erittäin suositeltavaa, että käytämme sulkeita koodin luettavuuden parantamiseksi.
C ++ -operaattoreiden etusijataulukko
Seuraava taulukko (otettu osoitteesta cppreference.com) näyttää C ++ -operaattoreiden etusijan. Etusijataso 1 merkitsee korkeimman prioriteetin operaattoreita, kun taas prioriteettitaso 17 tarkoittaa matalin prioriteetin operaattoreita.
Omaisuutta assosiatiivisuus keskustellaan lähiaikoina.
Ensisijaisuus | Operaattori | Kuvaus | Assosiatiivisuus |
---|---|---|---|
1 | :: | Laajuuden tarkkuus | Vasemmalta oikealle |
2 | a ++ a-- type () type () a () a () . -> | Laajennuksen / jälkiliitteen lisäys Laajennuksen / jälkiliitteen vähennys Toiminnon suoratoisto Toiminnon suoratoisto Toiminnon kutsu Alaindeksi Jäsenen pääsy objektista Jäsenen pääsy objektista ptr | Vasemmalta oikealle |
3 | ++ a --a + a -a ! ~ (Tyyppi) * & A sizeof co_await uusi uusi () Poista Poista () | Etuliitteen lisäys Etuliitteen vähennys Unary plus Unary miinus looginen EI bittikohtaisesti EI C-tyylinen suoran suuntaus (poikkeama) odota-lausekkeen osoitteen koko Dynaaminen muistin allokointi Dynaaminen muistin jakautuminen | Oikealta vasemmalle |
4 | . * -> * | Jäsenobjektin valitsin Jäsenosoittimen valitsin | Vasemmalta oikealle |
5 | a * b a / b a% b | Kertominen Division Modulus | Vasemmalta oikealle |
6 | a + b a - b | Lisäyksen vähennys | Vasemmalta oikealle |
7 | << >> | Vasemmalla vasemmalla, oikealla oikealla | Vasemmalta oikealle |
8 | <= < | Kolmisuuntainen vertailuoperaattori | Vasemmalta oikealle |
9 | < <= > > = | Pienempi tai pienempi tai suurempi kuin suurempi tai suurempi | Vasemmalta oikealle |
10 | == ! = | Yhtä kuin Ei yhtä | Vasemmalta oikealle |
11 | & | Bittikohtaisesti JA | Vasemmalta oikealle |
12 | ^ | Bitteittäin XOR | Vasemmalta oikealle |
13 | | | Bittiä TAI | Vasemmalta oikealle |
14 | && | Looginen JA | Vasemmalta oikealle |
15 | || | Looginen TAI | Vasemmalta oikealle |
16 | a? b: c heittää co_yield = + = - = * = / = % = << = >> = & = = | = | Kolmikertainen ehdollinen heitto-operaattorin tuottolauseke (C ++ 20) Tehtävän lisäys Tehtävä Vähennyslasku Tehtävän kertolasku Tehtävän jako Tehtävä Moduuli Tehtävä Bitoittain Vaihda Vasen Tehtävä Bituaalisesti Vaihda Oikea Tehtävä bittiä JA Osoitus Bitita XOR Tehtävä Bitti TAI Tehtävä | Oikealta vasemmalle |
17 | , | Pilkkuoperaattori | Vasemmalta oikealle |
C ++ -operaattoreiden assosiatiivisuus
Operaattorin assosiatiivisuus on suunta , josta lauseke arvioidaan. Esimerkiksi,
int a = 1; int b = 4; // a will be 4 a = b;
Katsokaa a = 4;
lausuntoa. =
Operaattorin assosiatiivisuus on oikealta vasemmalle. Siksi b: n arvo osoitetaan a: lle, ei toiseen suuntaan.
Myös useilla operaattoreilla voi olla sama etusijataso (kuten voimme nähdä yllä olevasta taulukosta). Kun lausekkeessa käytetään useita saman prioriteettitason operaattoreita, ne arvioidaan niiden assosiatiivisuuden mukaan .
int a = 1; int b = 4; b += a -= 6;
Sekä operaattoreilla +=
että -=
operaattoreilla on sama etusija. Koska näiden operaattorien assosiatiivisuus on oikealta vasemmalle, viimeinen lause arvioidaan näin.
a -= 6
arvioidaan ensin. Siksi a on -5- Sitten
b += -5
arvioidaan. Siksi b on -1
Esimerkki 2: Operaattoreiden assosiatiivisuus
#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; )
Tuotos
a = -5 b = -1