Šioje pamokoje sužinosite apie operatoriaus pirmenybę ir asociatyvumą C #. Tai leis mums suprasti, kaip išraišką vertina C # kompiliatorius.
C # Operatoriaus pirmenybė
Operatoriaus pirmenybė yra taisyklių rinkinys, apibrėžiantis, kaip vertinama išraiška. C # kiekvienam C # operatoriui yra priskirtas prioritetas ir, remiantis šiais prioritetais, išraiška yra vertinama.
Pavyzdžiui , daugybos (*)
operatoriaus pirmenybė yra didesnė už pridėjimo (+)
operatoriaus pirmenybę . Todėl prieš pridedant atliekama daugyba.
Pažvelkite į žemiau pateiktą teiginį.
int x = 4 + 3 * 5;
Kokia bus x reikšmė įvykdžius šį teiginį?
Operandas 3
siejamas su +
ir *
. Kaip minėta anksčiau, daugyba turi didesnę pirmenybę nei pridėjimas. Taigi, operacija 3 * 5
atliekama vietoj 4 + 3
. Kintamojo x reikšmė bus 19
.
Jei pridėjimas turėtų didesnę pirmenybę, 4 + 3
jis būtų įvertintas pirmiausia ir x reikšmė būtų 35
.
Operatoriaus pirmenybės lentelė
Kuo didesnis operatoriaus prioritetas, tuo didesnis jis rodomas lentelėje
C # Operatoriaus pirmenybėKategorija | Operatoriai |
---|---|
„Postfix“ prieaugis ir sumažėjimas | ++, - |
Priešdėlio prieaugis, mažinimas ir vienetinis | ++, -, +, -,!, ~ |
Dauginantis | *, /,% |
Priedas | +, - |
„Shift“ | <> |
Santykinis | <,,> = |
Lygybė | ==,! = |
Bitais IR | & |
Bitais XOR | ^ |
ARBA bitais | | |
Loginis IR | && |
Logiška ARBA | || |
Ternaras | ? : |
Užduotis | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
Priskyrimo operatoriai turi mažiausią pirmenybę, o „postfix“ prieaugio ir mažinimo operatoriai.
1 pavyzdys: Operatoriaus pirmenybė
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); ) ) )
Kai vykdysime programą, išvestis bus:
19 Klaidinga
Supraskime, kaip išraiška vertinama programoje.
Pirmenybė --
ir ++
yra didesnė už *
, o pirmenybė *
yra didesnė nei -
. Taigi teiginys,
rezultatas1 = --a * b - ++ c;
yra lygiavertis
rezultatas1 = ((--a) * b) - (++ c);
Išraiška skliaustuose visada vertinama pirmiausia, nesvarbu, kokia yra už jos ribų esančių operatorių pirmenybė.
- Iš pradžių įvertinamas (--a) į
4
. - Tada (++ c) įvertinama, gaunant į
5
. - Dabar įvertinama (a * b), gaunama į
24
. - Galiausiai atliekamas atimimas, kurio rezultatas yra
19
. - Taigi galutinė rezultato1 vertė bus
19
.
Kitoje išraiškoje pirmenybė +
yra didesnė nei >=
. Taigi, pirmiausia pridedama c ir a, o suma gaunama lyginant su b false
.
Operatorių asociacija C #
Ankstesniame skyriuje aptarėme operatoriaus pirmenybę. Jei naudojami du skirtingo prioriteto operatoriai, pirmiausia įvertinamas aukštesnio prioriteto operatorius.
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;
=
Operatoriaus asociatyvumas yra iš dešinės į kairę . Taigi c (ty 3
) reikšmė priskiriama b, o tada b reikšmė priskiriama a. Taigi, įvykdžius šį teiginį, a, b ir c reikšmės bus 3
.
Žemiau esančioje lentelėje parodytas C # operatorių asociatyvumas:
C # Operatorių asociatyvumasKategorija | Operatoriai | Asociatyvumas |
---|---|---|
„Postfix“ prieaugis ir sumažėjimas | ++, - | Iš kairės į dešinę |
Priešdėlio prieaugis, mažinimas ir vienetinis | ++, -, +, -,!, ~ | Iš dešinės į kairę |
Dauginantis | *, /,% | Iš kairės į dešinę |
Priedas | +, - | Iš kairės į dešinę |
„Shift“ | <> | Iš kairės į dešinę |
Santykinis | <,,> = | Iš kairės į dešinę |
Lygybė | ==,! = | Iš kairės į dešinę |
Bitais IR | & | Iš kairės į dešinę |
Bitais XOR | ^ | Iš kairės į dešinę |
ARBA bitais | | | Iš kairės į dešinę |
Loginis IR | && | Iš kairės į dešinę |
Logiška ARBA | || | Iš kairės į dešinę |
Ternaras | ? : | Iš dešinės į kairę |
Užduotis | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | Iš dešinės į kairę |
Beveik visi operatoriai turi asociaciją iš kairės į dešinę. Operatoriai, turintys asociaciją iš dešinės į kairę, yra:
- Unariniai operatoriai
- Prefiksų prieaugio ir mažinimo operatoriai
- Ternarinis operatorius
- Užduočių operatoriai
2 pavyzdys: Operatorių asociatyvumas
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); ) ) )
Kai vykdysime programą, išvestis bus:
10 a = 3, b = 3, c = 3