C ++ -operaattorin etusija ja assosiatiivisuus

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 * 6arvioidaan ensin.

Tämän seurauksena yllä oleva lauseke vastaa

 int x = 5 - (17 * 6);

Jos haluamme arvioida 5 - 17ensin, 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 -= 6arvioidaan ensin. Siksi a on -5
  • Sitten b += -5arvioidaan. 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

Mielenkiintoisia artikkeleita...