C # Precedența și asociativitatea operatorilor: definiție și exemple

Î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 3este asociat cu +și *. După cum sa menționat anterior, multiplicarea are o prioritate mai mare decât adunarea. Deci, operația 3 * 5se efectuează în loc de 4 + 3. Valoarea variabilei x va fi 19.

Dacă adunarea ar avea o prioritate mai mare, 4 + 3ar 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 operatorului
Categorie 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 * beste 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 operatorilor
Categorie 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

Articole interesante...