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








