C ++ operatora prioritāte un asociativitāte

Šajā apmācībā mēs ar piemēru palīdzību uzzināsim par operatoru prioritāti un asociativitāti C ++.

C ++ operatoru prioritāte

Ja vienā izteiksmē ir vairāki operatori, darbības netiek novērtētas vienlaikus. Drīzāk vispirms tiek novērtēti operatori ar augstāku prioritāti .

Apskatīsim piemēru:

 int x = 5 - 17 * 6; 

Šeit reizināšanas operatoram *ir augstāka prioritāte nekā atņemšanas operatoram -. Tādējādi 17 * 6vispirms tiek novērtēts.

Rezultātā iepriekšminētā izteiksme ir ekvivalenta

 int x = 5 - (17 * 6);

Ja mēs vēlamies vispirms novērtēt 5 - 17, mums tie jāiekļauj iekavās :

 int x = (5 - 17) * 6;

1. piemērs: Operatoru prioritāte

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

Rezultāts

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

Piezīme: Tā kā C ++ ir daudz operatoru ar vairākiem prioritātes līmeņiem, ir ļoti ieteicams izmantot iekavas, lai padarītu mūsu kodu vieglāk lasāmu.

C ++ Operatoru prioritātes tabula

Šī tabula (ņemta no vietnes cppreference.com) parāda C ++ operatoru prioritāti. 1. prioritātes līmenis nozīmē operatorus ar visaugstāko prioritāti, savukārt 17. prioritātes līmenis - operatorus ar viszemāko prioritāti.

Drīz tiks apspriests asociācijas īpašums .

Priekšroka Operators Apraksts Asociativitāte
1 :: Darbības jomas izšķirtspēja No kreisās uz labo
2 a ++
a--
tips ()
tips ()
a ()
a ()
.
->
Suffix / postfix increment
Piedēļu / postfix decrement
Funkcijas cast
Funkcijas cast
Funkcijas izsaukums
Apakšraksts Locekļa
piekļuve no objekta
Dalībnieka piekļuve no objekta ptr
No kreisās uz labo
3 ++ a
-
a + a
-a
!
~
(Tips)
*
& A
sizeof
co_await
jauns jauns ()
Izdzēst ()
Prefikss pieaugums
Prefikss samazināšanās
unāro plus
unāro mīnus
Loģiskā NOT
Bitu līmeņa NAV
C stils cast
inDirection (dereference)
adrese-of
izmērs-of
gaida-izteiksmes
Dinamiskā atmiņa piešķiršana
Dinamiskā atmiņa deallocation
Pa labi pa kreisi
4 . *
-> *
Dalībnieka objekta atlasītājs
Dalībnieka rādītāja atlasītājs
No kreisās uz labo
5 a * b
a / b
a% b
Reizināšanas
nodaļas
modulis
No kreisās uz labo
6 a + b
a - b
Papildinājums
Atņemšana
No kreisās uz labo
7 <<
>>
Pa kreisi nobīde
Pa labi pa labi
No kreisās uz labo
8 <= < Trīsceļu salīdzināšanas operators No kreisās uz labo
9 <
<=
>
> =
Mazāks par
mazāku vai vienāds ar
Lielāks par
Lielāks par vai vienāds ar
No kreisās uz labo
10 ==
! =
Vienāds ar
Nav vienāds ar
No kreisās uz labo
11 & Bitu virzienā UN No kreisās uz labo
12 ^ Bitor XOR No kreisās uz labo
13 | Bitwise OR No kreisās uz labo
14 && Loģiski UN No kreisās uz labo
15 || Loģiski VAI No kreisās uz labo
16 a? b: c
mest
līdzsvara
=
+ =
- =
* =
/ =
% =
<< =
>> =
& =
=
| =
Trijnieks Nosacījuma
mest operators
raža izteiksme (C ++ 20)
Uzdevums
Papildinājums Uzdevums
atņemšana Uzdevums
Reizināšana Uzdevums
nodaļa Uzdevums
Modulis Uzdevums
Bitu līmeņa Shift Left Uzdevums
Bitu līmeņa Shift Tiesības Pielietojums
Bitu līmeņa un piešķiršanai
Bitu līmeņa XOR Pielietojums
Bitu līmeņa vai nodošanu,
Pa labi pa kreisi
17 , Komatu operators No kreisās uz labo

C ++ Operatoru asociācija

Operatora asociativitāte ir virziens, no kura tiek vērtēta izteiksme. Piemēram,

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

Apskatiet a = 4;paziņojumu. No Saistījuma =operatoram ir no labās puses uz kreiso. Tādējādi b vērtība tiek piešķirta a, nevis citā virzienā.

Arī vairākiem operatoriem var būt vienāds prioritātes līmenis (kā mēs redzam no iepriekšējās tabulas). Ja izteiksmē tiek izmantoti vairāki vienas un tās pašas prioritātes pakāpes operatori, tos novērtē pēc to asociativitātes .

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

Gan operatoriem, +=gan -=operatoriem ir vienāda prioritāte. Tā kā šo operatoru asociativitāte ir no labās uz kreiso, lūk, kā tiek vērtēts pēdējais apgalvojums.

  • a -= 6vispirms tiek novērtēts. Tādējādi a būs -5
  • Tad b += -5tiks novērtēts. Tādējādi b būs -1

2. piemērs: Operatoru asociācija

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

Rezultāts

 a = -5 b = -1

Interesanti raksti...