C # Voorrang en associativiteit van operators: definitie en voorbeelden

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 3is gekoppeld aan +en *. Zoals eerder vermeld, heeft vermenigvuldiging een hogere prioriteit dan optellen. De bewerking 3 * 5wordt dus uitgevoerd in plaats van 4 + 3. De waarde van variabele x zal zijn 19.

Als optellen een hogere prioriteit zou hebben, 4 + 3zou 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 voorrang
Categorie 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 * bwordt 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 operators
Categorie 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

Interessante artikelen...