Š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 * 6
vispirms 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 -= 6
vispirms tiek novērtēts. Tādējādi a būs -5- Tad
b += -5
tiks 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