C ++ operatørpræference og associativitet

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 * 6evalueres 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 -= 6evalueres først. Derfor vil en være -5
  • Derefter b += -5vil 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

Interessante artikler...