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 * 6
se 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 -= 6
se najprej oceni. Zato bo a -5- Nato
b += -5
bo 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