În acest tutorial veți afla despre prioritatea operatorului și asociativitatea în C #. Acest lucru ne va oferi o idee despre modul în care o expresie este evaluată de compilatorul C #.
C # Precedența operatorului
Prioritatea operatorului este un set de reguli care definește modul în care este evaluată o expresie. În C #, fiecare operator C # are o prioritate atribuită și pe baza acestor priorități, expresia este evaluată.
De exemplu , precedența (*)
operatorului de multiplicare este mai mare decât precedența (+)
operatorului de adunare . Prin urmare, operația care implică multiplicare se efectuează înainte de adunare.
Aruncați o privire la afirmația de mai jos.
int x = 4 + 3 * 5;
Care va fi valoarea lui x după executarea acestei instrucțiuni?
Operandul 3
este asociat cu +
și *
. După cum sa menționat anterior, multiplicarea are o prioritate mai mare decât adunarea. Deci, operația 3 * 5
se efectuează în loc de 4 + 3
. Valoarea variabilei x va fi 19
.
Dacă adunarea ar avea o prioritate mai mare, 4 + 3
ar fi evaluată mai întâi și valoarea lui x ar fi 35
.
Tabelul de precedență al operatorului
Cu cât este mai mare prioritatea operatorului, cu atât apare mai mare în tabel
C # Precedența operatoruluiCategorie | Operatori |
---|---|
Creșterea și scăderea Postfix | ++, - |
Prefix Increment, Decrement și Unary | ++, -, +, -,!, ~ |
Multiplicativ | *, /,% |
Aditiv | +, - |
Schimb | <> |
Relațional | <,,> = |
Egalitate | ==,! = |
Bitwise ȘI | & |
Bitwise XOR | ^ |
OR bit | | |
Logic ȘI | && |
OR logic | || |
Ternar | ? : |
Misiune | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
Operatorii de atribuire au cea mai mică prioritate, în timp ce operatorii de creștere și descreștere postfix au cea mai mare prioritate.
Exemplul 1: Precedența operatorului
using System; namespace Operator ( class OperatorPrecedence ( public static void Main(string() args) ( int result1; int a = 5, b = 6, c = 4; result1 = --a * b - ++c; Console.WriteLine(result1); bool result2; result2 = b>= c + a; Console.WriteLine(result2); ) ) )
Când rulăm programul, ieșirea va fi:
19 Fals
Să înțelegem cum este evaluată expresia în program.
Precedența --
și ++
este mai mare decât *
și precedenta lui *
este mai mare decât -
. De aici declarația,
rezultat1 = --a * b - ++ c;
este echivalent cu
result1 = ((--a) * b) - (++ c);
Expresia din paranteze este întotdeauna evaluată mai întâi, indiferent de prioritatea operatorilor din afara acesteia.
- La început, (--a) este evaluat rezultând
4
. - Apoi (++ c) este evaluat rezultând în
5
. - Acum, (a * b) este evaluat rezultând în
24
. - În cele din urmă, scăderea se efectuează rezultând
19
. - Prin urmare, valoarea finală a rezultatului 1 va fi
19
.
În următoarea expresie, prioritatea lui +
este mai mare decât >=
. Deci, c și a se adaugă mai întâi și suma este comparată cu b pentru a produce false
.
Asociativitatea operatorilor în C #
În secțiunea anterioară, am discutat despre prioritatea operatorului. Dacă se utilizează doi operatori cu prioritate diferită, se evaluează primul operatorul cu prioritate mai mare.
Dar dacă ambii operatori au aceeași prioritate?
În acest caz, expresia este evaluată pe baza asociativității operatorului (de la stânga la dreapta sau de la dreapta la stânga).
De exemplu:
int a = 5, b = 6, c = 3; int result = a * b / c;
Aici, ambele *
și /
au aceeași prioritate. Dar, deoarece asociativitatea acestor operatori este de la stânga la dreapta , a * b
este evaluată mai întâi și apoi se efectuează divizarea. Rezultatul final al acestei expresii va fi 10
.
În acest exemplu particular, asociativitatea nu contează cu adevărat. Pentru că, chiar dacă diviziunea ar fi efectuată înainte de înmulțire, rezultatul ar fi neafectat.
Să aruncăm o privire la un alt exemplu.
int a = 5, b = 6, c = 3; a = b = c;
Asociativitatea =
operatorului este de la dreapta la stânga . Deci, valoarea lui c (adică 3
) este atribuită lui b, iar apoi valoarea lui b este atribuită lui a. Deci, după executarea acestei instrucțiuni, valorile a, b și c vor fi 3
.
Tabelul de mai jos arată asociativitatea operatorilor C #:
C # Asociativitatea operatorilorCategorie | Operatori | Asociativitate |
---|---|---|
Creșterea și scăderea Postfix | ++, - | De la stânga la dreapta |
Prefix Increment, Decrement și Unary | ++, -, +, -,!, ~ | De la dreapta la stanga |
Multiplicativ | *, /,% | De la stânga la dreapta |
Aditiv | +, - | De la stânga la dreapta |
Schimb | <> | De la stânga la dreapta |
Relațional | <,,> = | De la stânga la dreapta |
Egalitate | ==,! = | De la stânga la dreapta |
Bitwise ȘI | & | De la stânga la dreapta |
Bitwise XOR | ^ | De la stânga la dreapta |
OR bit | | | De la stânga la dreapta |
Logic ȘI | && | De la stânga la dreapta |
OR logic | || | De la stânga la dreapta |
Ternar | ? : | De la dreapta la stanga |
Misiune | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | De la dreapta la stanga |
Aproape toți operatorii au asociativitate de la stânga la dreapta. Operatorii care au asociativitate de la dreapta la stânga sunt:
- Operatori unari
- Prefix Operatori de creștere și descreștere
- Operator ternar
- Operatori de misiune
Exemplul 2: Asociativitatea operatorilor
using System; namespace Operator ( class OperatorPrecedence ( public static void Main(string() args) ( int a = 5, b = 6, c = 3; int result = a * b / c; Console.WriteLine(result); a = b = c; Console.WriteLine("a = (0), b = (1), c = (2)", a, b, c); ) ) )
Când rulăm programul, ieșirea va fi:
10 a = 3, b = 3, c = 3