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 3
je povezan sa +
i *
. Kao što je ranije rečeno, množenje ima veći prioritet od zbrajanja. Dakle, operacija 3 * 5
se provodi umjesto 4 + 3
. Vrijednost varijable x bit će 19
.
Ako bi zbrajanje imalo veći prioritet, 4 + 3
prvo 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 * b
prvo 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 operatoraKategorija | 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