Prednost in asociativnost operaterja C ++

V tej vadnici bomo s pomočjo primerov spoznali prednost in asociativnost operaterjev v jeziku C ++.

Prednost operaterjev C ++

Če je v enem izrazu več operaterjev, se operacije ne vrednotijo ​​hkrati. Namesto operaterjev z večjo prednostjo se najprej oceni njihovo poslovanje.

Oglejmo si primer:

 int x = 5 - 17 * 6; 

Tu ima operater množenja *višjo stopnjo prednosti kot operater odštevanja -. Zato 17 * 6se najprej oceni.

Kot rezultat je zgornji izraz enakovreden

 int x = 5 - (17 * 6);

Če želimo najprej ovrednotiti 5 - 17, jih moramo priložiti v oklepaje :

 int x = (5 - 17) * 6;

Primer 1: Prednost operaterjev

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

Izhod

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

Opomba: Ker je v C ++ veliko operaterjev z več prednostnimi stopnjami, je zelo priporočljivo, da uporabimo oklepaje, da bo naša koda bolj berljiva.

Tabela prednosti operaterjev C ++

Naslednja tabela (vzeta s cppreference.com) prikazuje prednost operaterjev C ++. Precedence Level 1 označuje operaterje najvišje prioritete, medtem ko Precedence Level 17 operaterje najnižje prioritete.

O lastnostih asociativnosti bomo govorili v kratkem.

Prednost Operater Opis Asociativnost
1. :: Resolucija o obsegu Od leve proti desni
2. a ++
a--
type ()
type ()
a ()
a ()
.
->
Pripona / postfix prirastek
pripona / postfix padanje
Funkcija litega
Funkcija litega
Funkcija klica
Indeks
dostop Član od objekta za
članice dostopa iz objekta PTR
Od leve proti desni
3. ++ a
--a
+ a
-a
!
~
(type)
* a
&
sizeof
co_await
new new ()
delete delete ()
Prirastek
predpone Predpona dekrement
Unary plus Unary
minus
Logical NOT
Bitwise NOT
C style cast
Indirection (dereference)
Address of
Size-of
- await -expression
Dinamično dodeljevanje
pomnilnika Dinamično sprostitev pomnilnika
Desno na levo
4. . *
-> *
Izbirnik predmeta
člana Izbirnik kazalca člana
Od leve proti desni
5. a * b
a / b
a% b
Množenje
Divizija
Modul
Od leve proti desni
6. a + b
a - b
Seštevanje
Odštevanje
Od leve proti desni
7. <<
>>
Bit-premik v levo
Bit-shift v desno
Od leve proti desni
8. <= < Trosmerni operater primerjave Od leve proti desni
9. <
<=
>
> =
Manj kot
Manj kot ali enako
Večji kot
Večji ali enak
Od leve proti desni
10. ==
! =
Enako kot
Ni enako
Od leve proti desni
11. & Bitovno AND Od leve proti desni
12. ^ Bitno XOR Od leve proti desni
13. | Bitovno ALI Od leve proti desni
14. && Logično IN Od leve proti desni
15. || Logično ALI Od leve proti desni
16. a? b: c
vrgel
co_yield
=
+ =
- =
* =
/ =
% =
<< =
>> =
& =
=
| =
Ternarni pogojni
met operaterja
izraz izraza (C ++ 20)
Dodelitev Dodelitev
Dodelitev
Odštevanje Dodelitev
Množenje Dodelitev
Oddelek Naloga
Modul Dodelitev
Bitwise Shift Leva dodelitev
Bitwise Shift Desna dodelitev
Bitwise IN Dodelitev
Bitwise XOR Dodelitev
Bitwise ALI Dodelitev
Desno na levo
17. , Operater vejice Od leve proti desni

Združenje operaterjev C ++

Asociativnost operaterja je smer, iz katere se ovrednoti izraz. Na primer

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

Oglejte si a = 4;izjavo. Asociativnost =operaterja je od desne proti levi. Zato je vrednost b dodeljena a in ne v drugo smer.

Tudi več operaterjev ima lahko enako prednost (kot lahko vidimo iz zgornje tabele). Kadar je v izrazu uporabljenih več operaterjev iste stopnje prednosti, se ovrednotijo ​​glede na njihovo asociativnost .

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

Tako operaterji +=kot -=operaterji imajo enako prednost. Ker je asociativnost teh operatorjev od desne proti levi, je tukaj ovrednotena zadnja izjava.

  • a -= 6se najprej oceni. Zato bo a -5
  • Nato b += -5bo ocenjeno. Zato bo b -1

Primer 2: Združenje operaterjev

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

Izhod

 a = -5 b = -1

Zanimive Članki...