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 3
je povezan z +
in *
. Kot smo že omenili, ima množenje večjo prednost kot seštevanje. Torej, operacija 3 * 5
se izvede namesto 4 + 3
. Vrednost spremenljivke x bo 19
.
Če bi seštevanje imelo večjo prednost, 4 + 3
bi 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 * b
se 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 operaterjevKategorija | 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