V tomto tutoriáli sa dozvieme o prioritách a asociativite operátorov v C #. Takto získate predstavu o tom, ako je výraz vyhodnotený kompilátorom C #.
Prednosť operátora C #
Prednosť operátora je sada pravidiel, ktorá definuje, ako sa výraz hodnotí. V C # má každý operátor C # priradenú prioritu a na základe týchto priorít sa vyhodnotí výraz.
Napríklad prednosť (*)
operátora násobenia je vyššia ako prednosť pred (+)
operátorom sčítania . Preto sa pred pridaním vykoná operácia zahŕňajúca násobenie.
Zoznámte sa s vyhlásením uvedeným nižšie.
int x = 4 + 3 * 5;
Aká bude hodnota x po vykonaní tohto príkazu?
Operand 3
je spojený s +
a *
. Ako už bolo uvedené, násobenie má vyššiu prednosť ako sčítanie. Takže operácia 3 * 5
sa vykonáva namiesto 4 + 3
. Hodnota premennej x bude 19
.
Ak by malo pridanie vyššiu prioritu, 4 + 3
vyhodnotilo by sa to najskôr a hodnota x by bola 35
.
Tabuľka predností operátora
Čím vyššia je prednosť operátora, tým vyššia je v tabuľke
Prednosť operátora C #Kategória | Operátorov |
---|---|
Prírastok a pokles Postfixu | ++, - |
Prírastok, zníženie a unárne prefixu | ++, -, +, -,!, ~ |
Multiplikatívne | *, /,% |
Aditívne | +, - |
Posun | <> |
Relačné | <,,> = |
Rovnosť | ==,! = |
Bitové AND | & |
Bitový XOR | ^ |
Bitové ALEBO | | |
Logické AND | && |
Logické ALEBO | || |
Ternárne | ? : |
Postúpenie | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
Operátory priradenia majú najnižšiu prioritu, zatiaľ čo operátory prírastku a zníženia postfixu majú najvyššiu prioritu.
Príklad 1: Prednosť operátora
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); ) ) )
Keď spustíme program, výstup bude:
19 Falošné
Poďme pochopiť, ako sa výraz hodnotí v programe.
Prednosť --
a ++
je vyššia ako *
a prednosť *
je vyššia ako -
. Preto vyhlásenie,
výsledok1 = --a * b - ++ c;
je ekvivalentné k
výsledok1 = ((--a) * b) - (++ c);
Výraz v zátvorkách sa vždy vyhodnotí ako prvý bez ohľadu na to, aké sú prednosti operátorov mimo neho.
- Najskôr sa (--a) vyhodnotí s výsledkom
4
. - Potom sa vyhodnotí (++ c), výsledkom je
5
. - Teraz je vyhodnotené (a * b), výsledkom je
24
. - Nakoniec sa vykoná odčítanie, ktoré vedie k
19
. - Konečná hodnota result1 teda bude
19
.
V ďalšom výraze je prednosť pred +
vyššia ako >=
. Takže, c a a sa pridá ako prvé a súčet sa porovná s b, aby sa vytvoril false
.
Asociativita operátorov v C #
V predchádzajúcej časti sme hovorili o prednosti operátora. Ak sa použijú dva operátory s rôznou prednosťou, vyhodnotí sa najskôr operátor s vyššou prioritou.
Čo však v prípade, ak majú obaja operátori rovnaké prednosť?
V takom prípade sa výraz hodnotí na základe asociativity operátora (zľava doprava alebo sprava doľava).
Napríklad:
int a = 5, b = 6, c = 3; int výsledok = a * b / c;
Tu, ako *
a /
majú rovnakú prioritu. Ale pretože asociatívnosť týchto operátorov je zľava doprava , a * b
hodnotí sa najskôr a potom sa uskutoční delenie. Konečný výsledok tohto výrazu bude 10
.
V tomto konkrétnom príklade na asociativite vlastne nezáleží. Pretože aj keby sa delenie uskutočnilo pred násobením, výsledok by nebol ovplyvnený.
Pozrime sa na ďalší príklad.
int a = 5, b = 6, c = 3; a = b = c;
Asociativita =
operátora je sprava doľava . Takže hodnota c (tj. 3
) Je priradená b, a potom hodnota b je priradená a. Takže po vykonaní tohto príkazu budú hodnoty a, b a c 3
.
Nasledujúca tabuľka zobrazuje asociativitu operátorov C #:
C # Asociativita operátorovKategória | Operátorov | Asociatívnosť |
---|---|---|
Prírastok a pokles Postfixu | ++, - | Zľava doprava |
Prírastok, zníženie a unárne prefixu | ++, -, +, -,!, ~ | Zprava doľava |
Multiplikatívne | *, /,% | Zľava doprava |
Aditívne | +, - | Zľava doprava |
Posun | <> | Zľava doprava |
Relačné | <,,> = | Zľava doprava |
Rovnosť | ==,! = | Zľava doprava |
Bitové AND | & | Zľava doprava |
Bitový XOR | ^ | Zľava doprava |
Bitové ALEBO | | | Zľava doprava |
Logické AND | && | Zľava doprava |
Logické ALEBO | || | Zľava doprava |
Ternárne | ? : | Zprava doľava |
Postúpenie | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | Zprava doľava |
Takmer všetci operátori majú asociativitu zľava doprava. Prevádzkovatelia, ktorí majú asociativitu sprava doľava, sú:
- Unárne operátory
- Operátory prírastku a zníženia prefixu
- Ternárny operátor
- Prevádzkovatelia pridelenia
Príklad 2: Asociativita operátorov
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); ) ) )
Keď spustíme program, výstup bude:
10 a = 3, b = 3, c = 3