Dans ce didacticiel, vous découvrirez la priorité des opérateurs et l'associativité en C #. Cela nous donnera une idée de la façon dont une expression est évaluée par le compilateur C #.
Priorité des opérateurs C #
La priorité des opérateurs est un ensemble de règles qui définit la manière dont une expression est évaluée. En C #, chaque opérateur C # a une priorité assignée et en fonction de ces priorités, l'expression est évaluée.
Par exemple , la priorité de l' (*)
opérateur de multiplication est supérieure à la priorité de l' (+)
opérateur d' addition . Par conséquent, l'opération impliquant la multiplication est effectuée avant l'addition.
Jetez un œil à la déclaration ci-dessous.
int x = 4 + 3 * 5;
Quelle sera la valeur de x après l'exécution de cette instruction?
L'opérande 3
est associé à +
et *
. Comme indiqué précédemment, la multiplication a une priorité plus élevée que l'addition. Ainsi, l'opération 3 * 5
est effectuée à la place de 4 + 3
. La valeur de la variable x sera 19
.
Si l'addition avait une priorité plus élevée, 4 + 3
serait évaluée en premier et la valeur de x serait 35
.
Table de préséance des opérateurs
Plus la priorité de l'opérateur est élevée, plus il apparaît dans le tableau
Priorité des opérateurs C #Catégorie | Les opérateurs |
---|---|
Incrément et décrément de Postfix | ++, - |
Incrément, décrémentation et unaire du préfixe | ++, -, +, -,!, ~ |
Multiplicatif | *, /,% |
Additif | +, - |
Décalage | <> |
Relationnel | <,,> = |
Égalité | ==,! = |
ET au niveau du bit | & |
XOR au niveau du bit | ^ |
OU au niveau du bit | | |
ET logique | && |
OU logique | || |
Ternaire | ? : |
Affectation | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
Les opérateurs d'affectation ont la priorité la plus faible tandis que les opérateurs d'incrémentation et de décrémentation de suffixe ont la priorité la plus élevée.
Exemple 1: Priorité des opérateurs
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); ) ) )
Lorsque nous exécutons le programme, la sortie sera:
19 Faux
Comprenons comment l'expression est évaluée dans le programme.
La priorité de --
et ++
est supérieure à *
, et la priorité de *
est supérieure à -
. D'où la déclaration,
résultat1 = --a * b - ++ c;
est équivalent à
résultat1 = ((--a) * b) - (++ c);
L'expression entre parenthèses est toujours évaluée en premier, quelle que soit la priorité des opérateurs à l'extérieur.
- Au début, (--a) est évalué, ce qui donne
4
. - Ensuite, (++ c) est évalué résultant en
5
. - Maintenant, (a * b) est évalué résultant en
24
. - Enfin, la soustraction est effectuée résultant en
19
. - Par conséquent, la valeur finale de result1 sera
19
.
Dans l'expression suivante, la priorité de +
est supérieure à >=
. Ainsi, c et a sont ajoutés en premier et la somme est comparée à b pour produire false
.
Associativité des opérateurs en C #
Dans la section précédente, nous avons discuté de la priorité des opérateurs. Si deux opérateurs avec une priorité différente sont utilisés, l'opérateur avec la priorité la plus élevée est évalué en premier.
Mais que faire si les deux opérateurs ont la même priorité?
Dans ce cas, l'expression est évaluée en fonction de l'associativité de l'opérateur (de gauche à droite ou de droite à gauche).
Par exemple:
int a = 5, b = 6, c = 3; résultat int = a * b / c;
Ici, les deux *
et /
ont la même priorité. Mais comme l'associativité de ces opérateurs est de gauche à droite , elle a * b
est d'abord évaluée puis la division est effectuée. Le résultat final de cette expression sera 10
.
Dans cet exemple particulier, l'associativité n'a pas vraiment d'importance. Car même si la division était effectuée avant la multiplication, le résultat ne serait pas affecté.
Jetons un œil à un autre exemple.
int a = 5, b = 6, c = 3; a = b = c;
L'associativité de l' =
opérateur est de droite à gauche . Ainsi, la valeur de c (c'est-à-dire 3
) est affectée à b, puis la valeur de b est affectée à a. Ainsi, après avoir exécuté cette instruction, les valeurs de a, b et c seront 3
.
Le tableau ci-dessous montre l'associativité des opérateurs C #:
Associativité C # des opérateursCatégorie | Les opérateurs | Associativité |
---|---|---|
Incrément et décrément de Postfix | ++, - | De gauche à droite |
Incrément, décrémentation et unaire du préfixe | ++, -, +, -,!, ~ | De droite à gauche |
Multiplicatif | *, /,% | De gauche à droite |
Additif | +, - | De gauche à droite |
Décalage | <> | De gauche à droite |
Relationnel | <,,> = | De gauche à droite |
Égalité | ==,! = | De gauche à droite |
ET au niveau du bit | & | De gauche à droite |
XOR au niveau du bit | ^ | De gauche à droite |
OU au niveau du bit | | | De gauche à droite |
ET logique | && | De gauche à droite |
OU logique | || | De gauche à droite |
Ternaire | ? : | De droite à gauche |
Affectation | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | De droite à gauche |
Presque tous les opérateurs ont une associativité de gauche à droite. Les opérateurs ayant une associativité de droite à gauche sont:
- Opérateurs unaires
- Opérateurs d'incrémentation et de décrémentation de préfixe
- Opérateur ternaire
- Opérateurs d'affectation
Exemple 2: Associativité des opérateurs
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); ) ) )
Lorsque nous exécutons le programme, la sortie sera:
10 a = 3, b = 3, c = 3