I denne vejledning lærer vi om forrang og associativitet af operatører i C ++ ved hjælp af eksempler.
C ++ - operatørernes præference
Hvis der er flere operatorer i et enkelt udtryk, evalueres operationerne ikke samtidigt. Snarere får operatører med højere forrang deres operationer først vurderet.
Lad os overveje et eksempel:
int x = 5 - 17 * 6;
Her har multiplikationsoperatoren *
højere prioritetsniveau end subtraktionsoperatoren -
. Derfor 17 * 6
evalueres først.
Som et resultat svarer ovenstående udtryk til
int x = 5 - (17 * 6);
Hvis vi først vil evaluere 5 - 17
, skal vi omslutte dem inden for parenteser :
int x = (5 - 17) * 6;
Eksempel 1: Operatørernes forrang
#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; )
Produktion
num1 = -97 num2 = -97 num3 = -72
Bemærk: Da der er mange operatører i C ++ med flere forrangsniveauer, anbefales det stærkt, at vi bruger parenteser for at gøre vores kode mere læsbar.
C ++ - operatørers prioritetstabel
Følgende tabel (taget fra cppreference.com) viser forrang for C ++ - operatører. Prioritetsniveau 1 betegner operatører med højeste prioritet, mens præcedensniveau 17 betegner operatører med lavest prioritet.
Associativitetens egenskab vil blive drøftet kort.
Forrang | Operatør | Beskrivelse | Associativitet |
---|---|---|---|
1 | :: | Omfangsopløsning | Venstre til højre |
2 | a ++ a-- type () type () a () a () . -> | Suffix / postfix forøgelse Suffix / postfix dekrement Funktion cast Funktion cast Funktion kald Opkald Abonnement Medlem adgang fra et objekt Medlem adgang fra objekt ptr | Venstre til højre |
3 | ++ a --a + a -a ! ~ (type) * a & en størrelse på co_await nyt nyt () slet slet () | Forhøjelse af præfiks Forhøjelse af præfiks Unary plus Unary minus Logisk IKKE bitvis IKKE C-stil cast Indirection (dereference) Address-of Size-of wait-expression Dynamic memory allocation Dynamic memory deallocation | Højre til venstre |
4 | . * -> * | Medlemsobjektvælger Medlemsvælgervælger | Venstre til højre |
5 | a * b a / b a% b | Multiplikation Division Modulus | Venstre til højre |
6 | a + b a - b | Addition Subtraktion | Venstre til højre |
7 | << >> | Bitvis venstre skift Bitvis højre skift | Venstre til højre |
8 | <= < | Trevejs sammenligningsoperatør | Venstre til højre |
9 | < <= > > = | Mindre end mindre end eller lig med større end større end eller lig med | Venstre til højre |
10 | == ! = | Lige med Ikke lig med | Venstre til højre |
11 | & | Bitvis OG | Venstre til højre |
12 | ^ | Bitvis XOR | Venstre til højre |
13 | | | Bitvis ELLER | Venstre til højre |
14 | && | Logisk OG | Venstre til højre |
15 | || | Logisk ELLER | Venstre til højre |
16 | a? b: c kaste co_yield = + = - = * = / = % = << = >> = & = = | = | Ternært Betinget kaste operatør udbytte ekspression (C ++ 20) Opgave Addition Opgave Subtraktion Opgave Multiplikation Assignment Division Opgave Modulus Assignment Bitvis Shift Venstre Assignment Bitvis Shift Højre Opgave Bitvis OG Opgave Bitvis XOR Opgave Bitvis ELLER Opgave | Højre til venstre |
17 | , | Komma-operatør | Venstre til højre |
C ++ Operators Associativity
Operatørassociativitet er den retning, hvorfra et udtryk evalueres. For eksempel,
int a = 1; int b = 4; // a will be 4 a = b;
Se på a = 4;
udsagnet. =
Operatørens associativitet er fra højre mod venstre. Derfor tildeles værdien af b til a og ikke i den anden retning.
Flere operatører kan også have samme prioritetsniveau (som vi kan se fra ovenstående tabel). Når der anvendes flere operatorer af samme prioritetsniveau i et udtryk, evalueres de i henhold til deres associativitet .
int a = 1; int b = 4; b += a -= 6;
Både operatører +=
og -=
operatører har samme forrang. Da disse operatørers associativitet er fra højre mod venstre, så vurderes den sidste erklæring.
a -= 6
evalueres først. Derfor vil en være -5- Derefter
b += -5
vil blive evalueret. Derfor vil b være -1
Eksempel 2: Operators Associativity
#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; )
Produktion
a = -5 b = -1