I denne vejledning lærer vi om operatørprioritet og associativitet i C #. Dette giver os en idé om, hvordan et udtryk evalueres af C # compileren.
C # Operatørpræference
Operatørprioritet er et sæt regler, der definerer, hvordan et udtryk vurderes. I C # har hver C # -operatør en tildelt prioritet, og baseret på disse prioriteter evalueres udtrykket.
For eksempel er multiplikationsoperatorens forrang (*)
højere end prioritet for additionsoperator (+)
. Derfor udføres operation, der involverer multiplikation, før tilsætning.
Se på udsagnet nedenfor.
int x = 4 + 3 * 5;
Hvad vil være værdien af x efter udførelse af denne erklæring?
Operanden 3
er forbundet med +
og *
. Som nævnt tidligere har multiplikation en højere prioritet end tilføjelse. Så operationen 3 * 5
udføres i stedet for 4 + 3
. Værdien af variablen x er 19
.
Hvis tilføjelse ville have en højere prioritet, 4 + 3
ville den først blive evalueret, og værdien af x ville være 35
.
Operatørens prioritetstabel
Jo højere operatøren har forrang, jo højere vises den i tabellen
C # OperatørpræferenceKategori | Operatører |
---|---|
Postfix forøgelse og nedgang | ++, - |
Præfiks forøgelse, nedgang og unary | ++, -, +, -,!, ~ |
Multiplikativ | *, /,% |
Tilsætningsstof | +, - |
Flytte | <> |
Relationel | <,,> = |
Lighed | ==,! = |
Bitvis OG | & |
Bitvis XOR | ^ |
Bitvis ELLER | | |
Logisk OG | && |
Logisk ELLER | || |
Ternær | ? : |
Opgave | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
Tildelingsoperatørerne har den laveste prioritet, mens postfix-tilvækst- og dekrementeringsoperatørerne har den højeste prioritet.
Eksempel 1: Operatørpræference
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); ) ) )
Når vi kører programmet, vil output være:
19 Falsk
Lad os forstå, hvordan udtrykket evalueres i programmet.
Forrang for --
og ++
er højere end *
, og forrang for *
er højere end -
. Derfor erklæringen,
resultat1 = --a * b - ++ c;
svarer til
resultat1 = ((--a) * b) - (++ c);
Udtrykket inden for parenteser evalueres altid først, uanset hvilken prioritet operatører uden for det har.
- Først evalueres (--a), hvilket resulterer i
4
. - Derefter (++ c) evalueres resulterende i
5
. - Nu, (a * b) evalueres resulterende i
24
. - Endelig udføres subtraktionen, hvilket resulterer i
19
. - Derfor bliver den endelige værdi af resultat1
19
.
I det næste udtryk er forrang af +
højere end >=
. Så c og a tilføjes først, og summen sammenlignes med b for at producere false
.
Associativitet af operatører i C #
I det forrige afsnit diskuterede vi førernes forrang. Hvis der anvendes to operatorer med forskellig prioritet, vurderes operatøren med højere prioritet først.
Men hvad hvis begge operatører har samme forrang?
I et sådant tilfælde evalueres udtrykket ud fra operatorens associativitet (venstre mod højre eller højre mod venstre).
For eksempel:
int a = 5, b = 6, c = 3; int resultat = a * b / c;
Her både *
og /
har samme præcedens. Men da associeringsevnen af disse operatører er fra venstre mod højre , a * b
evalueres først, og derefter udføres deling. Det endelige resultat af dette udtryk bliver 10
.
I dette særlige eksempel betyder associativitet ikke rigtig noget. For selv hvis opdeling blev udført før multiplikation, ville resultatet ikke blive påvirket.
Lad os se på et andet eksempel.
int a = 5, b = 6, c = 3; a = b = c;
=
Operatørens associativitet er fra højre mod venstre . Så værdien af c (dvs. 3
) tildeles b, og derefter tildeles værdien af b til a. Så efter udførelsen af denne erklæring vil værdierne for a, b og c være 3
.
Tabellen nedenfor viser associeringsevnen for C # -operatører:
C # Operatørers tilknytningKategori | Operatører | Associativitet |
---|---|---|
Postfix forøgelse og nedgang | ++, - | Venstre til højre |
Præfiks forøgelse, nedgang og unary | ++, -, +, -,!, ~ | Højre til venstre |
Multiplikativ | *, /,% | Venstre til højre |
Tilsætningsstof | +, - | Venstre til højre |
Flytte | <> | Venstre til højre |
Relationel | <,,> = | Venstre til højre |
Lighed | ==,! = | Venstre til højre |
Bitvis OG | & | Venstre til højre |
Bitvis XOR | ^ | Venstre til højre |
Bitvis ELLER | | | Venstre til højre |
Logisk OG | && | Venstre til højre |
Logisk ELLER | || | Venstre til højre |
Ternær | ? : | Højre til venstre |
Opgave | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | Højre til venstre |
Næsten alle operatører har associativitet fra venstre mod højre. Operatørerne, der har associativitet fra højre til venstre, er:
- Unary operatører
- Præfiks forøgelses- og formindskelsesoperatører
- Ternær operatør
- Opgaveoperatører
Eksempel 2: Operatørers tilknytning
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); ) ) )
Når vi kører programmet, vil output være:
10 a = 3, b = 3, c = 3