C#-operatorvoorrang en associativiteit
C#-operatorvoorrang en associativiteit
In deze tutorial leer je over operatorprioriteit en associativiteit in C#. Dit geeft ons een idee van hoe een expressie wordt geëvalueerd door de C#-compiler.
C#-operatorvoorrang
Operatorprioriteit is een set regels die bepaalt hoe een expressie wordt geëvalueerd. In C# heeft elke C#-operator een toegewezen prioriteit en op basis van deze prioriteiten wordt de uitdrukking geëvalueerd.
Bijvoorbeeld , de prioriteit van vermenigvuldiging (*)
operator is hoger dan de prioriteit van optellen (+)
exploitant. Daarom wordt een bewerking met vermenigvuldiging uitgevoerd vóór optelling.
Bekijk de verklaring hieronder.
int x = 4 + 3 * 5;
Wat zal de waarde zijn van x na het uitvoeren van deze instructie?
De operand 3
wordt geassocieerd met +
en *
. Zoals eerder vermeld, heeft vermenigvuldigen een hogere prioriteit dan optellen. Dus de bewerking 3 * 5
wordt uitgevoerd in plaats van 4 + 3
. De waarde van variabele x wordt 19
.
Als toevoeging een hogere prioriteit zou hebben, 4 + 3
zou eerst worden geëvalueerd en de waarde van x zou 35
. zijn .
Voorrangstabel operator
Hoe hoger de prioriteit van de operator, hoe hoger deze in de tabel wordt weergegeven
Categorie | Operators |
---|---|
Postfix verhogen en verlagen | ++, -- |
Prefix Verhogen, Verlagen en Unair | ++, --, +, -, !, ~ |
Multiplicatief | *, /, % |
Additief | +, - |
Shift | <<,>> |
Relationeel | <, <=,>,>= |
Gelijkheid | ==, != |
Bitgewijs EN | & |
Bitwise XOR | ^ |
Bitgewijs OF | | |
Logisch EN | && |
Logische OF | || |
Ternair | ? : |
Opdracht | =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=,>>= |
De toewijzingsoperatoren hebben de laagste prioriteit, terwijl de postfix-operatoren voor verhogen en verlagen de hoogste prioriteit hebben.
Voorbeeld 1:Voorrang van operator
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 False
Laten we eens kijken hoe de uitdrukking in het programma wordt geëvalueerd.
De prioriteit van --
en ++
is hoger dan *
, en voorrang van *
is hoger dan -
. Vandaar de verklaring,
result1 = --a * b - ++c;
is gelijk aan
result1 = ((--a)*b)-(++c);
De uitdrukking tussen haakjes wordt altijd eerst geëvalueerd, ongeacht de prioriteit van de operatoren erbuiten.
- Aanvankelijk (--a) wordt geëvalueerd wat resulteert in
4
.
- Vervolgens (++c) wordt geëvalueerd wat resulteert in
5
.
- Nu, (a * b) wordt geëvalueerd wat resulteert in
24
.
- Ten slotte wordt de aftrekking uitgevoerd, wat resulteert in
19
.
- Vandaar de uiteindelijke waarde van result1 wordt
19
.
In de volgende uitdrukking, de prioriteit van +
is hoger dan >=
. Dus, c en een wordt eerst opgeteld en de som wordt vergeleken met b om false
te produceren .
Associativiteit van operators in C#
In de vorige sectie hebben we het gehad over operatorprioriteit. Als twee operators met verschillende prioriteit worden gebruikt, wordt de operator met hogere prioriteit eerst geëvalueerd.
Maar wat als beide operators dezelfde prioriteit 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 result = a * b / c;
Hier, beide *
en /
dezelfde voorrang hebben. 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 is 10
.
In dit specifieke voorbeeld doet de associativiteit er niet echt toe. Want zelfs als deling werd uitgevoerd vóór vermenigvuldiging, zou het resultaat onaangetast blijven.
Laten we een ander voorbeeld bekijken.
int a = 5, b = 6, c = 3; a = b = c;
De associativiteit van =
operator is van rechts naar links . Dus de waarde van c (d.w.z. 3
) is toegewezen aan b , en dan de waarde van b is toegewezen aan a . Dus na het uitvoeren van deze instructie, worden de waarden van a , b en c wordt 3
.
De onderstaande tabel toont de associativiteit van C#-operators:
Categorie | Operators | Associativiteit |
---|---|---|
Postfix verhogen en verlagen | ++, -- | Links naar rechts |
Prefix Verhogen, Verlagen en Unair | ++, --, +, -, !, ~ | Van rechts naar links |
Multiplicatief | *, /, % | Links naar rechts |
Additief | +, - | Links naar rechts |
Shift | <<,>> | Links naar rechts |
Relationeel | <, <=,>,>= | Links naar rechts |
Gelijkheid | ==, != | Links naar rechts |
Bitgewijs EN | & | Links naar rechts |
Bitwise XOR | ^ | Links naar rechts |
Bitgewijs OF | | | Links naar rechts |
Logisch EN | && | Links naar rechts |
Logische OF | || | Links naar rechts |
Ternair | ? : | Van rechts naar links |
Opdracht | =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=,>>= | Van rechts naar links |
Bijna alle operatoren hebben associativiteit van links naar rechts. De operatoren met associativiteit van rechts naar links zijn:
- Unaire operatoren
- Voorvoegsel voor het verhogen en verlagen van operators
- Ternaire operator
- Opdrachtoperators
Voorbeeld 2:Associativiteit van operators
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
C Taal
- C#-zoekwoorden en -ID's
- C#-operators
- C# ternair (? :) Operator
- C# klasse en object
- C# abstracte klasse en methode
- C# Gedeeltelijke klasse en gedeeltelijke methode
- C# verzegelde klasse en methode
- Operators in C++ met voorbeeld:wat is, typen en programma's
- C - Constanten en Letters
- C - Invoer en uitvoer
- C++ Datum en tijd