Prednost in združljivost operaterjev C #: opredelitev in primeri

V tej vadnici bomo spoznali prednost operaterja in asociativnost v C #. To nam bo dalo predstavo o tem, kako prevajalnik C # ocenjuje izraz.

Prednost operaterja C #

Prednost operaterja je niz pravil, ki določa, kako se izraz ocenjuje. V C # ima vsak operater C # dodeljeno prioriteto in na podlagi teh prioritet se izraz izračuna.

Na primer , prednost (*)operatorja množenja je večja kot prednost (+)operaterja seštevanja . Zato se pred množenjem izvede postopek množenja.

Oglejte si spodnjo izjavo.

 int x = 4 + 3 * 5;

Kakšna bo vrednost x po izvedbi tega stavka?

Operand 3je povezan z +in *. Kot smo že omenili, ima množenje večjo prednost kot seštevanje. Torej, operacija 3 * 5se izvede namesto 4 + 3. Vrednost spremenljivke x bo 19.

Če bi seštevanje imelo večjo prednost, 4 + 3bi bilo najprej ovrednoteno in vrednost x bi bila 35.

Tabela prednosti operaterja

Čim večja je prednost operatorja, tem večji je v tabeli

Prednost operaterja C #
Kategorija Operaterji
Postfix Povečanje in zmanjševanje ++, -
Predpona Povečanje, Zmanjšanje in Unarno ++, -, +, -,!, ~
Multiplikativni *, /,%
Dodatek +, -
Shift <>
Relacijski <,,> =
Enakost ==,! =
Bitovno AND &
Bitno XOR ^
Bitovno ALI |
Logično IN &&
Logično ALI ||
Ternarni ? :
Dodelitev =, + =, - =, * =, / =,% =, & =, | =, =, <> =

Operatorji dodelitve imajo najnižjo prednost, medtem ko imajo operaterji povečanja in zmanjšanja postfix najvišjo prednost.

Primer 1: Prednost operaterja

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

Ko zaženemo program, bo rezultat:

 19 Neresnično

Razumejmo, kako se izraz ocenjuje v programu.

Prednost --in ++je večja od *, in prednost *je večja od -. Od tod izjava,

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

je enakovredno

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

Izraz v oklepajih se vedno najprej oceni, ne glede na prednost operaterjev zunaj njega.

  • Sprva se ovrednoti (--a), kar ima za posledico 4.
  • Nato se ovrednoti (++ c), kar ima za posledico 5.
  • Zdaj se ovrednoti (a * b), kar ima za posledico 24.
  • Na koncu se izvede odštevanje, ki ima za posledico 19.
  • Zato bo končna vrednost rezultata1 19.

V naslednjem izrazu je prednost +višja od >=. Torej se najprej dodata c in a, vsota pa se primerja z b, da nastane false.

Združenje operaterjev v C #

V prejšnjem poglavju smo razpravljali o prednosti operaterja. Če uporabimo dva operaterja z različno prednostjo, se najprej oceni operater z višjo prednostjo.

Kaj pa, če imata oba operaterja enako prednost?

V takem primeru se izraz izračuna na podlagi asociativnosti operaterja (od leve proti desni ali od desne proti levi).

Na primer:

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

Tu imata oba prednost *in /enako prednost. Ker pa je asociativnost teh operatorjev od leve proti desni , a * bse najprej oceni in nato izvede delitev. Končni rezultat tega izraza bo 10.

V tem konkretnem primeru asociativnost v resnici ni pomembna. Kajti tudi če bi deljenje izvedli pred množenjem, to ne bi vplivalo na rezultat.

Oglejmo si še en primer.

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

Asociativnost =operaterja je od desne proti levi . Torej je vrednost c (tj. 3) Dodeljena b, nato pa je vrednost b dodeljena a. Po izvedbi te izjave bodo vrednosti a, b in c 3.

Spodnja tabela prikazuje asociativnost operaterjev C #:

C # Asociativnost operaterjev
Kategorija Operaterji Asociativnost
Postfix Povečanje in zmanjševanje ++, - Od leve proti desni
Predpona Povečanje, Zmanjšanje in Unarno ++, -, +, -,!, ~ Desno na levo
Multiplikativni *, /,% Od leve proti desni
Dodatek +, - Od leve proti desni
Shift <> Od leve proti desni
Relacijski <,,> = Od leve proti desni
Enakost ==,! = Od leve proti desni
Bitovno AND & Od leve proti desni
Bitno XOR ^ Od leve proti desni
Bitovno ALI | Od leve proti desni
Logično IN && Od leve proti desni
Logično ALI || Od leve proti desni
Ternarni ? : Desno na levo
Dodelitev =, + =, - =, * =, / =,% =, & =, | =, =, <> = Desno na levo

Skoraj vsi operaterji imajo asociativnost od leve proti desni. Operatorji, ki imajo asociativnost od desne proti levi, so:

  • Unarni operaterji
  • Operatorji povečanja in zmanjšanja predpone
  • Ternarni operater
  • Operatorji dodelitve

Primer 2: Asociativnost operaterjev

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

Ko zaženemo program, bo rezultat:

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

Zanimive Članki...