C ++ Operator Precedence and Associativity

I den här självstudien lär vi oss om förekomsten och associativiteten hos operatörer i C ++ med hjälp av exempel.

C ++ operatörers företräde

Om det finns flera operatorer i ett enda uttryck utvärderas inte operationerna samtidigt. Snarare får operatörer med högre prioritet först utvärdera sin verksamhet.

Låt oss överväga ett exempel:

 int x = 5 - 17 * 6; 

Här har multiplikationsoperatorn *högre prioritet än subtraktionsoperatören -. Därför 17 * 6utvärderas först.

Som ett resultat är ovanstående uttryck ekvivalent med

 int x = 5 - (17 * 6);

Om vi ​​först vill utvärdera 5 - 17måste vi stänga dem inom parentes :

 int x = (5 - 17) * 6;

Exempel 1: Operatörens företräde

 #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

Obs! Eftersom det finns många operatörer i C ++ med flera nivåer av företräde rekommenderas det starkt att vi använder parenteser för att göra vår kod mer läsbar.

C ++ - operatörens prioritetstabell

Följande tabell (hämtad från cppreference.com) visar C ++ -operatörernas företräde. Prioritetsnivå 1 betyder operatörer med högsta prioritet, medan Prioritetsnivå 17 betyder operatörer med lägsta prioritet.

Egendom associativitet kommer att diskuteras inom kort.

Företräde Operatör Beskrivning Associativitet
1 :: Omfattningsupplösning Vänster till höger
2 a ++
a--
typ ()
typ ()
a ()
a ()
.
->
Suffix / postfix ökning
Suffix / postfix minskning
Funktion cast
Funktion cast
Funktion samtal
Prenumeration
Medlemstillgång från ett objekt
Medlemstillgång från objekt ptr
Vänster till höger
3 ++ a
--a
+ a
-a
!
~
(typ)
* a
& en
storlek på
co_await
nytt nytt ()
radera ta bort ()
Förhöjning av prefix
Prefix minskning
Unary plus
Unary minus
Logiskt INTE
Bitvis INTE
C-
stilbesättning Indirektion (Dereference)
Adress-av
Storlek på
inväntat-uttryck
Dynamisk minnesallokering
Dynamiskt minne
Höger till vänster
4 . *
-> *
Välj objekt för
medlemsobjekt
Vänster till höger
5 a * b
a / b
a% b
Multiplikation
division
Modulus
Vänster till höger
6 a + b
a - b
Addition
Subtraktion
Vänster till höger
7 <<
>>
Bitvis vänster skift
Bitvis höger skift
Vänster till höger
8 <= < Trevägs jämförelseoperatör Vänster till höger
9 <
<=
>
> =
Mindre än
mindre än eller lika med
större än
större än eller lika med
Vänster till höger
10 ==
! =
Lika med
Ej lika med
Vänster till höger
11 & Bitvis OCH Vänster till höger
12 ^ Bitvis XOR Vänster till höger
13 | Bitvis ELLER Vänster till höger
14 && Logisk OCH Vänster till höger
15 || Logiskt ELLER Vänster till höger
16 a? b: c
kasta
co_yield
=
+ =
- =
* =
/ =
% =
<< =
>> =
& =
=
| =
Ternära Villkors
kasta operatör
utbyte uttryck (C ++ 20)
Assignment
Addition Assignment
Subtraktion Assignment
Multiplikation Assignment
Division Assignment
Modulus Assignment
Bitvis Shift Vänster Assignment
Bitvis Shift Höger Assignment
Bitvis OCH Assignment
Bitvis XOR Assignment
Bitvis ELLER Assignment
Höger till vänster
17 , Kommaoperatör Vänster till höger

C ++ Operators Associativity

Operatörsassociativitet är den riktning från vilken ett uttryck utvärderas. Till exempel,

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

Ta en titt på a = 4;uttalandet. =Operatörens associativitet är från höger till vänster. Följaktligen tilldelas värdet på b och inte i andra riktningen.

Flera operatörer kan också ha samma prioritetsnivå (som vi kan se från ovanstående tabell). När flera operatörer med samma prioritetsnivå används i ett uttryck utvärderas de utifrån deras associativitet .

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

Både operatörer +=och -=operatörer har samma företräde. Eftersom dessa operatörers associativitet är från höger till vänster, så utvärderas det senaste uttalandet.

  • a -= 6utvärderas först. Därför blir a -5
  • Därefter b += -5kommer att utvärderas. Därför kommer b att vara -1

Exempel 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

Intressanta artiklar...