C # Prednost i asocijativnost operatora: definicija i primjeri

U ovom uputstvu naučit ćemo o prednosti operatora i asocijativnosti u C #. To će nam dati ideju kako ocjenjivač izraza ocjenjuje izraz.

Prednost operatora C #

Prednost operatora skup je pravila koji definira kako se izraz ocjenjuje. U C #, svaki C # operator ima dodijeljeni prioritet i na temelju tih prioriteta ocjenjuje se izraz.

Na primjer , prioritet (*)operatora množenja veći je od prednosti (+)operatora zbrajanja . Stoga se operacija koja uključuje množenje provodi prije zbrajanja.

Pogledajte izjavu u nastavku.

 int x = 4 + 3 * 5;

Kolika će biti vrijednost x nakon izvršavanja ove izjave?

Operand 3je povezan sa +i *. Kao što je ranije rečeno, množenje ima veći prioritet od zbrajanja. Dakle, operacija 3 * 5se provodi umjesto 4 + 3. Vrijednost varijable x bit će 19.

Ako bi zbrajanje imalo veći prioritet, 4 + 3prvo bi se procjenjivalo, a vrijednost x bila bi 35.

Tablica prednosti operatora

Što je prednost operatora veća, to se veći pojavljuje u tablici

Prednost operatora C #
Kategorija Operateri
Postfix povećanje i smanjenje ++, -
Prefiks Inkrement, Dekrement i Unary ++, -, +, -,!, ~
Multiplikativni *, /,%
Aditiv +, -
Shift <>
Relacijski <,,> =
Jednakost ==,! =
Bitno I &
Bitno XOR ^
Bitno ILI |
Logično I &&
Logično ILI ||
Ternarni ? :
Zadatak =, + =, - =, * =, / =,% =, & =, | =, =, <> =

Operatori dodjele imaju najmanji prioritet, dok operatori povećanja i smanjenja postfiksa imaju najveći prioritet.

Primjer 1: Prednost operatora

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

Kada pokrenemo program, izlaz će biti:

 19 Lažno

Razumijemo kako se izraz ocjenjuje u programu.

Prioritet --i ++veći je od *, a prioritet *je veći od -. Stoga je izjava,

 rezultat1 = --a * b - ++ c;

je ekvivalentan

 rezultat1 = ((--a) * b) - (++ c);

Izraz unutar zagrada uvijek se prvo procjenjuje bez obzira na prioritet operatora izvan njega.

  • Isprva se ocjenjuje (--a) što rezultira u 4.
  • Tada se (++ c) izračunava rezultirajući u 5.
  • Sada se (a * b) procjenjuje rezultirajući u 24.
  • Konačno, vrši se oduzimanje rezultirajući u 19.
  • Stoga će konačna vrijednost rezultata1 biti 19.

U sljedećem izrazu prioritet +je veći od >=. Dakle, c i a se dodaju prvo, a zbroj se uspoređuje s b da bi se dobilo false.

Asocijativnost operatora u C #

U prethodnom smo dijelu razgovarali o prednosti operatora. Ako se koriste dva operatora s različitim prioritetom, prvo se ocjenjuje operator s većim prioritetom.

Ali što ako oba operatora imaju istu prednost?

U tom se slučaju izraz ocjenjuje na temelju asocijativnosti operatora (slijeva udesno ili zdesna ulijevo).

Na primjer:

int a = 5, b = 6, c = 3; rezultat int = a * b / c;

Evo, kako *i /imaju istu prednost. Ali budući da je asocijativnost ovih operatora slijeva udesno , a * bprvo se ocjenjuje, a zatim se provodi podjela. Konačni rezultat ovog izraza bit će 10.

U ovom konkretnom primjeru asocijativnost zapravo nije bitna. Jer čak i kad bi se dijeljenje provodilo prije množenja, to ne bi utjecalo na rezultat.

Pogledajmo još jedan primjer.

int a = 5, b = 6, c = 3; a = b = c;

Asocijativnost =operatora je zdesna nalijevo . Tako je vrijednost c (tj. 3) Dodijeljena b, a zatim je vrijednost b dodijeljena a. Dakle, nakon izvršavanja ove izjave, vrijednosti a, b i c bit će 3.

Tablica u nastavku prikazuje asocijativnost C # operatora:

C # Asocijativnost operatora
Kategorija Operateri Asocijativnost
Postfix povećanje i smanjenje ++, - S lijeva nadesno
Prefiks Inkrement, Dekrement i Unary ++, -, +, -,!, ~ S desna na lijevo
Multiplikativni *, /,% S lijeva nadesno
Aditiv +, - S lijeva nadesno
Shift <> S lijeva nadesno
Relacijski <,,> = S lijeva nadesno
Jednakost ==,! = S lijeva nadesno
Bitno I & S lijeva nadesno
Bitno XOR ^ S lijeva nadesno
Bitno ILI | S lijeva nadesno
Logično I && S lijeva nadesno
Logično ILI || S lijeva nadesno
Ternarni ? : S desna na lijevo
Zadatak =, + =, - =, * =, / =,% =, & =, | =, =, <> = S desna na lijevo

Gotovo svi operateri imaju asocijativnost slijeva udesno. Operatori koji imaju asocijativnost zdesna nalijevo su:

  • Unarni operatori
  • Operatori povećanja i smanjenja prefiksa
  • Ternarni operater
  • Operatori dodjele

Primjer 2: Asocijativnost operatora

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

Kada pokrenemo program, izlaz će biti:

 10 a = 3, b = 3, c = 3

Zanimljivi članci...