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








