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 3er forbundet med +og *. Som nævnt tidligere har multiplikation en højere prioritet end tilføjelse. Så operationen 3 * 5udføres i stedet for 4 + 3. Værdien af variablen x er 19.
Hvis tilføjelse ville have en højere prioritet, 4 + 3ville 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æference| Kategori | 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 * bevalueres 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 tilknytning| Kategori | 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








