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 * 6
wordt 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 -= 6
wordt eerst geëvalueerd. Daarom zal a -5 zijn- Vervolgens
b += -5
wordt 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