In deze tutorial leer je over operatorprioriteit en associativiteit in C #. Dit geeft ons een idee van hoe een uitdrukking wordt geëvalueerd door de C # -compiler.
C # Operator voorrang
Operatorprioriteit is een set regels die bepalen hoe een uitdrukking wordt geëvalueerd. In C # heeft elke C # -operator een toegewezen prioriteit en op basis van deze prioriteiten wordt de uitdrukking geëvalueerd.
De voorrang van de (*)
operator voor vermenigvuldigen is bijvoorbeeld hoger dan de voorrang van de (+)
operator voor optellen . Daarom wordt de bewerking met vermenigvuldiging uitgevoerd vóór de optelling.
Bekijk de onderstaande verklaring.
int x = 4 + 3 * 5;
Wat is de waarde van x na het uitvoeren van deze instructie?
De operand 3
is gekoppeld aan +
en *
. Zoals eerder vermeld, heeft vermenigvuldiging een hogere prioriteit dan optellen. De bewerking 3 * 5
wordt dus uitgevoerd in plaats van 4 + 3
. De waarde van variabele x zal zijn 19
.
Als optellen een hogere prioriteit zou hebben, 4 + 3
zou het eerst worden geëvalueerd en zou de waarde van x zijn 35
.
Operatorprioriteitstabel
Hoe hoger de prioriteit van de operator is, hoe hoger deze in de tabel wordt weergegeven
C # Operator voorrangCategorie | Operatoren |
---|---|
Postfix verhogen en verlagen | ++, - |
Voorvoegsel verhogen, verlagen en unair | ++, -, +, -,!, ~ |
Multiplicatief | *, /,% |
Additief | +, - |
Verschuiving | <> |
Relationeel | <,,> = |
Gelijkheid | ==,! = |
Bitwise EN | & |
Bitsgewijze XOR | ^ |
Bitsgewijs OF | | |
Logisch EN | && |
Logische OF | || |
Ternair | ? : |
Toewijzing | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
De toewijzingsoperatoren hebben de laagste prioriteit, terwijl de postfix-operatoren voor verhogen en verlagen de hoogste prioriteit hebben.
Voorbeeld 1: Operatorprioriteit
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); ) ) )
Wanneer we het programma uitvoeren, is de uitvoer:
19 Niet waar
Laten we begrijpen hoe de uitdrukking wordt geëvalueerd in het programma.
De prioriteit van --
en ++
is hoger dan *
, en de prioriteit van *
is hoger dan -
. Vandaar de verklaring,
resultaat1 = --a * b - ++ c;
is gelijk aan
resultaat1 = ((--a) * b) - (++ c);
De uitdrukking tussen haakjes wordt altijd eerst geëvalueerd, ongeacht de prioriteit van operators daarbuiten.
- Eerst wordt (--a) geëvalueerd, resulterend in
4
. - Vervolgens wordt (++ c) geëvalueerd, resulterend in
5
. - Nu wordt (a * b) geëvalueerd resulterend in
24
. - Ten slotte wordt het aftrekken uitgevoerd resulterend in
19
. - Vandaar dat de uiteindelijke waarde van resultaat1 zal zijn
19
.
In de volgende uitdrukking is de prioriteit van +
hoger dan >=
. Dus c en a worden eerst opgeteld en de som wordt vergeleken met b om te produceren false
.
Associativiteit van operators in C #
In de vorige sectie hebben we gesproken over de prioriteit van operators. Als er twee operators met verschillende prioriteit worden gebruikt, wordt de operator met de hoogste prioriteit eerst geëvalueerd.
Maar wat als beide operators dezelfde voorrang hebben?
In dat geval wordt de uitdrukking geëvalueerd op basis van de associativiteit van de operator (van links naar rechts of van rechts naar links).
Bijvoorbeeld:
int a = 5, b = 6, c = 3; int resultaat = a * b / c;
Hier hebben beide *
en /
dezelfde prioriteit. Maar aangezien de associativiteit van deze operatoren van links naar rechts is , a * b
wordt eerst geëvalueerd en vervolgens wordt de verdeling uitgevoerd. Het uiteindelijke resultaat van deze uitdrukking zal zijn 10
.
In dit specifieke voorbeeld doet de associativiteit er niet echt toe. Omdat zelfs als de deling vóór vermenigvuldiging werd uitgevoerd, het resultaat niet zou worden beïnvloed.
Laten we een ander voorbeeld bekijken.
int a = 5, b = 6, c = 3; a = b = c;
De associativiteit van de =
operator is van rechts naar links . Dus de waarde van c (ie 3
) wordt toegewezen aan b, en de waarde van b wordt toegewezen aan a. Dus na het uitvoeren van deze instructie, zullen de waarden van a, b en c zijn 3
.
De onderstaande tabel toont de associativiteit van C # -operatoren:
C # Associativiteit van operatorsCategorie | Operatoren | Associativiteit |
---|---|---|
Postfix verhogen en verlagen | ++, - | Van links naar rechts |
Voorvoegsel verhogen, verlagen en unair | ++, -, +, -,!, ~ | Rechts naar links |
Multiplicatief | *, /,% | Van links naar rechts |
Additief | +, - | Van links naar rechts |
Verschuiving | <> | Van links naar rechts |
Relationeel | <,,> = | Van links naar rechts |
Gelijkheid | ==,! = | Van links naar rechts |
Bitwise EN | & | Van links naar rechts |
Bitsgewijze XOR | ^ | Van links naar rechts |
Bitsgewijs OF | | | Van links naar rechts |
Logisch EN | && | Van links naar rechts |
Logische OF | || | Van links naar rechts |
Ternair | ? : | Rechts naar links |
Toewijzing | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | Rechts naar links |
Bijna alle operators hebben associativiteit van links naar rechts. De operatoren met associativiteit van rechts naar links zijn:
- Unaire operators
- Operatoren voor voorvoegselverhoging en verlaging
- Ternaire operator
- Toewijzingsoperatoren
Voorbeeld 2: Associativiteit van operatoren
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); ) ) )
Wanneer we het programma uitvoeren, is de uitvoer:
10 a = 3, b = 3, c = 3