C ++ Operator prioriteit en associativiteit

In deze tutorial zullen we met behulp van voorbeelden leren over de prioriteit en associativiteit van operators in C ++.

C ++ Operators voorrang

Als een enkele uitdrukking meerdere operatoren bevat, worden de bewerkingen niet tegelijkertijd geëvalueerd. Operatoren met een hogere prioriteit laten hun bewerkingen eerst evalueren.

Laten we een voorbeeld bekijken:

 int x = 5 - 17 * 6; 

Hier heeft de operator voor vermenigvuldigen een *hogere prioriteit dan de operator voor aftrekken -. Daarom 17 * 6wordt eerst geëvalueerd.

Als resultaat is de bovenstaande uitdrukking gelijk aan

 int x = 5 - (17 * 6);

Als we eerst willen evalueren 5 - 17, moeten we ze tussen haakjes plaatsen :

 int x = (5 - 17) * 6;

Voorbeeld 1: prioriteit van operators

 #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; )

Uitvoer

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

Opmerking: omdat er in C ++ veel operatoren zijn met meerdere voorrangsniveaus, wordt het ten zeerste aanbevolen haakjes te gebruiken om onze code leesbaarder te maken.

C ++ Operators Precedence Table

De volgende tabel (overgenomen van cppreference.com) toont de prioriteit van C ++ - operators. Prioriteitsniveau 1 duidt operators met de hoogste prioriteit aan, terwijl prioriteitsniveau 17 operators met de laagste prioriteit aangeeft.

De eigenschap van associativiteit komt binnenkort aan de orde.

Voorrang Operator Omschrijving Associativiteit
1 :: Reikwijdte resolutie Van links naar rechts
2 a ++
a--
type ()
type ()
a ()
a ()
.
->
Achtervoegsel / achtervoegsel increment
Achtervoegsel / postfix verlaging
Functie cast
Functie cast
Functie oproep
Subscript
Lid toegang vanaf een object
Lid toegang vanaf object ptr
Van links naar rechts
3 ++ a
--a
+ a
-a
!
~
(type)
* a
& a
sizeof
co_await
new new ()
delete delete ()
Voorvoegselverhoging
Voorvoegselverlaging
Unair plus
Unair min
Logisch NOT
Bitwise NOT
C-stijl cast
Indirection (dereference)
Adres-van
Grootte-van
wacht-uitdrukking
Dynamische geheugentoewijzing
Dynamische geheugentoewijzing
Rechts naar links
4 . *
-> *
Selector lidobject
lid pointer selector
Van links naar rechts
5 a * b
a / b
a% b
Vermenigvuldigen
Division
Modulus
Van links naar rechts
6 a + b
a - b
Optellen
Aftrekken
Van links naar rechts
7 <<
>>
Bitsgewijs naar links verschuiven
Bitsgewijs naar rechts verschuiven
Van links naar rechts
8 <= < Vergelijkingsoperator met drie richtingen Van links naar rechts
9 <
<=
>
> =
Kleiner dan
Kleiner dan of gelijk aan
Groter dan
Groter dan of gelijk aan
Van links naar rechts
10 ==
! =
Gelijk aan
niet gelijk aan
Van links naar rechts
11 & Bitwise EN Van links naar rechts
12 ^ Bitsgewijze XOR Van links naar rechts
13 | Bitsgewijs OF Van links naar rechts
14 && Logisch EN Van links naar rechts
15 || Logische OF Van links naar rechts
16 een ? b: c
worp
co_yield
=
+ =
- =
* =
/ =
% =
<< =
>> =
& =
=
| =
Ternair Voorwaardelijke
worp operator
opbrengst expressie (C ++ 20)
Toewijzing
Optellen Toewijzing
Aftrekken Toewijzing
Vermenigvuldiging Toewijzing
Divisie Toewijzing
Modulustoewijzing
Bitsgewijze verschuiving Toewijzing naar links
Bitsgewijze verschuiving Rechter toewijzing
Bitsgewijze EN Toewijzing
Bitsgewijze XOR-toewijzing
Bitsgewijs OF Toewijzing
Rechts naar links
17 , Komma-operator Van links naar rechts

C ++ Operators Associativity

Operatorassociativiteit is de richting van waaruit een uitdrukking wordt geëvalueerd. Bijvoorbeeld,

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

Bekijk a = 4;verklaring. De associativiteit van de =operator is van rechts naar links. Daarom wordt de waarde van b toegewezen aan a, en niet in de andere richting.

Ook kunnen meerdere operatoren dezelfde prioriteit hebben (zoals we kunnen zien in de bovenstaande tabel). Wanneer meerdere operators met hetzelfde voorrangsniveau in een uitdrukking worden gebruikt, worden ze geëvalueerd op basis van hun associativiteit .

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

Zowel operators +=als -=operators hebben dezelfde prioriteit. Aangezien de associativiteit van deze operatoren van rechts naar links is, wordt hier het laatste statement geëvalueerd.

  • a -= 6wordt eerst geëvalueerd. Daarom zal a -5 zijn
  • Vervolgens b += -5wordt geëvalueerd. Daarom is b -1

Voorbeeld 2: Associativiteit van operators

 #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; )

Uitvoer

 a = -5 b = -1

Interessante artikelen...