V tomto kurzu se dozvíte o prioritě operátora a asociativitě v C #. To nám dá představu o tom, jak je výraz vyhodnocen kompilátorem C #.
Přednost operátora C #
Priorita operátora je sada pravidel, která definují, jak je výraz vyhodnocen. V C # má každý operátor C # přiřazenou prioritu a na základě těchto priorit je výraz vyhodnocen.
Například priorita (*)
operátoru násobení je vyšší než priorita (+)
operátoru přidání . Proto se operace zahrnující násobení provádí před přidáním.
Podívejte se na prohlášení níže.
int x = 4 + 3 * 5;
Jaká bude hodnota x po provedení tohoto příkazu?
Operand 3
je spojen s +
a *
. Jak již bylo řečeno, násobení má vyšší prioritu než sčítání. Operace 3 * 5
se tedy provádí místo 4 + 3
. Hodnota proměnné x bude 19
.
Pokud by přidání mělo vyšší prioritu, 4 + 3
vyhodnotilo by se to nejprve a hodnota x by byla 35
.
Tabulka priorit operátora
Čím vyšší je priorita operátoru, tím vyšší je v tabulce
Přednost operátora C #Kategorie | Operátoři |
---|---|
Přírůstek a pokles Postfixu | ++, - |
Přírůstek, snížení a unární prefix | ++, -, +, -,!, ~ |
Multiplikativní | *, /,% |
Přísada | +, - |
Posun | <> |
Relační | <,,> = |
Rovnost | ==,! = |
Bitové AND | & |
Bitový XOR | ^ |
Bitové NEBO | | |
Logické AND | && |
Logické NEBO | || |
Trojice | ? : |
Úkol | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
Operátory přiřazení mají nejnižší prioritu, zatímco operátory přírůstku a zmenšení postfixu mají nejvyšší prioritu.
Příklad 1: Přednost 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); ) ) )
Když spustíme program, výstup bude:
19 Nepravda
Pojďme pochopit, jak je výraz v programu vyhodnocen.
Priorita --
a ++
je vyšší než *
a priorita *
je vyšší než -
. Proto prohlášení,
result1 = --a * b - ++ c;
je ekvivalentní k
result1 = ((--a) * b) - (++ c);
Výraz uvnitř závorek je vždy vyhodnocen jako první bez ohledu na to, jaké jsou přednosti operátorů mimo něj.
- Nejprve se vyhodnotí (--a), což má za následek
4
. - Poté se vyhodnotí (++ c), což má za následek
5
. - Nyní je (a * b) vyhodnoceno a výsledkem je
24
. - Nakonec se provede odečtení, které vede k
19
. - Konečná hodnota result1 proto bude
19
.
V dalším výrazu je priorita +
vyšší než >=
. Takže nejprve se přidá c a a součet se porovná s b, aby se vytvořil false
.
Asociativita operátorů v C #
V předchozí části jsme probrali prioritu operátorů. Pokud jsou použity dva operátory s odlišnou prioritou, je nejprve vyhodnocen operátor s vyšší prioritou.
But what if both the operators have same precedence?
In such case, the expression is evaluated based on the associativity of operator (left to right or right to left).
For example:
int a = 5, b = 6, c = 3; int result = a * b / c;
Here, both *
and /
have the same precedence. But since the associativity of these operators is from left to right, a * b
is evaluated first and then division is carried out. The final result of this expression will be 10
.
In this particular example, the associativity does not really matter. Because even if division was carried out before multiplication, the result would be unaffected.
Let's take a look at another example.
int a = 5, b = 6, c = 3; a = b = c;
Asociativita =
operátoru je zprava doleva . Takže hodnota c (tj. 3
) Je přiřazena b, a pak je hodnota b přiřazena a. Takže po provedení tohoto příkazu budou hodnoty a, b a c 3
.
Tabulka níže ukazuje asociativitu operátorů C #:
C # Asociativita operátorůKategorie | Operátoři | Asociativita |
---|---|---|
Přírůstek a pokles Postfixu | ++, - | Zleva do prava |
Přírůstek, snížení a unární prefix | ++, -, +, -,!, ~ | Zprava doleva |
Multiplikativní | *, /,% | Zleva do prava |
Přísada | +, - | Zleva do prava |
Posun | <> | Zleva do prava |
Relační | <,,> = | Zleva do prava |
Rovnost | ==,! = | Zleva do prava |
Bitové AND | & | Zleva do prava |
Bitový XOR | ^ | Zleva do prava |
Bitové NEBO | | | Zleva do prava |
Logické AND | && | Zleva do prava |
Logické NEBO | || | Zleva do prava |
Trojice | ? : | Zprava doleva |
Úkol | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | Zprava doleva |
Téměř všichni operátoři mají asociativitu zleva doprava. Operátoři, kteří mají asociativitu zprava doleva, jsou:
- Unární operátoři
- Operátoři přírůstku a snížení prefixu
- Ternární operátor
- Operátoři přiřazení
Příklad 2: Asociativita operátorů
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); ) ) )
Když spustíme program, výstup bude:
10 a = 3, b = 3, c = 3