Ebben az oktatóanyagban megismerheti a C # operátor elsőbbségét és asszociativitását. Ez képet ad nekünk arról, hogyan értékel egy kifejezést a C # fordító.
C # Operátor elsőbbség
Az operátori elsőbbség olyan szabálykészlet, amely meghatározza, hogy egy kifejezést hogyan kell értékelni. A C # -ban minden C # operátornak van hozzárendelt prioritása, és ezek alapján a kiértékelés kiértékelődik.
Például a szorzó (*)
operátor elsőbbsége magasabb, mint az összeadás (+)
operátor elsőbbsége . Ezért a szaporítással járó műveletet az összeadás előtt hajtják végre.
Vessen egy pillantást az alábbi nyilatkozatra.
int x = 4 + 3 * 5;
Mekkora lesz x értéke ennek az utasításnak a végrehajtása után?
A operandus 3
társul +
, és *
. Mint korábban említettük, a szorzásnak nagyobb az elsőbbsége, mint az összeadásnak. Tehát a műveletet 3 * 5
helyett 4 + 3
. A változó értéke x lesz 19
.
Ha az összeadásnak nagyobb az elsőbbsége, 4 + 3
akkor először kiértékelésre kerül, és x értéke meg lesz 35
.
Operátor elsőbbségi táblázat
Minél nagyobb az operátor elsőbbsége, annál magasabb jelenik meg a táblázatban
C # Operátor elsőbbségKategória | Operátorok |
---|---|
Postfix növekmény és csökkentés | ++, - |
Prefix Increment, Decrement és Unary | ++, -, +, -,!, ~ |
Szorzó | *, /,% |
Adalékanyag | +, - |
Váltás | <> |
Relációs | <,,> = |
Egyenlőség | ==,! = |
Bitenkénti ÉS | & |
Bitenként XOR | ^ |
Bitenként VAGY | | |
Logikai ÉS | && |
Logikai VAGY | || |
Hármas | ? : |
Feladat | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
A hozzárendelési operátoroknak van a legkisebb elsőbbségük, míg a postfix növekményének és csökkentésének operátorainak van a legnagyobb prioritása.
1. példa: Operátor elsőbbség
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); ) ) )
A program futtatásakor a kimenet a következő lesz:
19 Hamis
Értsük meg, hogyan értékelik a kifejezést a programban.
Az elsőbbsége --
és ++
magasabb, mint *
, és elsőbbsége *
magasabb, mint -
. Ezért a kijelentés,
eredmény1 = --a * b - ++ c;
egyenértékű
eredmény1 = ((--a) * b) - (++ c);
A zárójelben lévő kifejezést mindig először értékelik, függetlenül attól, hogy a rajta kívüli operátorok milyen elsőbbségűek.
- Először a (--a) értékét értékelik, amelynek eredményeként
4
. - Ezután (++ c) értéket kapunk, amelynek eredményeként a
5
. - Most (a * b) kiértékelését eredményezzük
24
. - Végül kivonásra kerül sor, amelynek eredményeként a
19
. - Ezért az eredmény1 végső értéke lesz
19
.
A következő kifejezésben a fontossági sorrend +
magasabb, mint >=
. Tehát először c és egy adunk hozzá, és az összeget összehasonlítjuk b-vel a termeléshez false
.
A C # operátorok asszociativitása
Az előző részben az operátor elsőbbségéről beszéltünk. Két különböző elsőbbségű operátor használata esetén először a magasabb prioritású operátort értékelik.
De mi van akkor, ha mindkét operátornak ugyanaz az elsőbbsége?
Ebben az esetben a kifejezést az operátor asszociativitása alapján értékelik (balról jobbra vagy jobbról balra).
Például:
int a = 5, b = 6, c = 3; int eredmény = a * b / c;
Itt mind *
és /
ugyanolyan elsőbbséget. De mivel ezeknek az operátoroknak az asszociativitása balról jobbra van , a * b
először kiértékelik, majd elvégzik a felosztást. Ennek a kifejezésnek a végeredménye az lesz 10
.
Ebben a konkrét példában az asszociativitás nem igazán számít. Mert ha az osztást a szorzás előtt hajtják végre, az eredmény nem lesz hatással.
Nézzünk meg egy másik példát.
int a = 5, b = 6, c = 3; a = b = c;
Az =
operátor asszociativitása jobbról balra . Tehát c (ie 3
) értéke hozzárendelődik b-hez, majd b értéke hozzá van rendelve a-hoz. Tehát ennek az utasításnak a végrehajtása után az a, b és c értékei meg fognak jelenni 3
.
Az alábbi táblázat a C # operátorok asszociativitását mutatja:
C # Operátorok asszociativitásaKategória | Operátorok | Asszociativitás |
---|---|---|
Postfix növekmény és csökkentés | ++, - | Balról jobbra |
Prefix Increment, Decrement és Unary | ++, -, +, -,!, ~ | Jobbról balra |
Szorzó | *, /,% | Balról jobbra |
Adalékanyag | +, - | Balról jobbra |
Váltás | <> | Balról jobbra |
Relációs | <,,> = | Balról jobbra |
Egyenlőség | ==,! = | Balról jobbra |
Bitenkénti ÉS | & | Balról jobbra |
Bitenként XOR | ^ | Balról jobbra |
Bitenként VAGY | | | Balról jobbra |
Logikai ÉS | && | Balról jobbra |
Logikai VAGY | || | Balról jobbra |
Hármas | ? : | Jobbról balra |
Feladat | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | Jobbról balra |
Szinte az összes operátornak asszociativitása van balról jobbra. Jobbról balra asszociatív operátorok:
- Unary operátorok
- Prefix növekmény és csökkentés operátorok
- Ternary Operator
- Feladatkezelők
2. példa: Operátorok asszociativitása
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); ) ) )
A program futtatásakor a kimenet a következő lesz:
10 a = 3, b = 3, c = 3