Priorité et associativité des opérateurs C ++

Dans ce tutoriel, nous allons en apprendre davantage sur la priorité et l'associativité des opérateurs en C ++ à l'aide d'exemples.

Priorité des opérateurs C ++

S'il existe plusieurs opérateurs dans une même expression, les opérations ne sont pas évaluées simultanément. Au contraire, les opérateurs ayant une priorité plus élevée voient leurs opérations évaluées en premier.

Analysons un exemple:

 int x = 5 - 17 * 6; 

Ici, l'opérateur de multiplication a *un niveau de priorité plus élevé que l'opérateur de soustraction -. Par conséquent, 17 * 6est évalué en premier.

Par conséquent, l'expression ci-dessus équivaut à

 int x = 5 - (17 * 6);

Si nous souhaitons évaluer d' 5 - 17abord, nous devons les mettre entre parenthèses :

 int x = (5 - 17) * 6;

Exemple 1: Priorité des opérateurs

 #include using namespace std; int main() ( // evaluates 17 * 6 first int num1 = 5 - 17 * 6; // equivalent expression to num1 int num2 = 5 - (17 * 6); // forcing compiler to evaluate 5 - 17 first int num3 = (5 - 17) * 6; cout << "num1 = " << num1 << endl; cout << "num2 = " << num2 << endl; cout << "num3 = " << num3 << endl; return 0; )

Production

 num1 = -97 num2 = -97 num3 = -72

Remarque: étant donné qu'il existe de nombreux opérateurs en C ++ avec plusieurs niveaux de priorité, il est fortement recommandé d'utiliser des parenthèses pour rendre notre code plus lisible.

Table de priorité des opérateurs C ++

Le tableau suivant (extrait de cppreference.com) montre la priorité des opérateurs C ++. Le niveau de priorité 1 signifie les opérateurs de priorité la plus élevée, tandis que le niveau de priorité 17 signifie les opérateurs de priorité la plus basse.

La propriété d' associativité sera discutée prochainement.

Priorité Opérateur La description Associativité
1 :: Résolution de la portée De gauche à droite
2 a ++
a--
type ()
type ()
a ()
a ()
.
->
Suffixe / incrément postfix
Suffixe / postfix décrément
Fonction fonte
Fonction fonte
Fonction appel
Subscript
Accès membre d'un objet
accès membre de l' objet ptr
De gauche à droite
3 ++ a
--a
+ a
-a
!
~
(type)
* a
& a
sizeof
co_await
new new ()
delete delete ()
Incrément de
préfixe Décrément de préfixe
Unaire plus
Unaire moins
Logique NON
Bit à bit NOT
C cast
Indirection (déréférencement)
Adresse de
Taille de l'
expression d' attente
Allocation de
mémoire dynamique Libération dynamique de la mémoire
De droite à gauche
4 . *
-> *
Sélecteur d'objet
membre Sélecteur de pointeur de membre
De gauche à droite
5 a * b
a / b
a% b
Module de
division de multiplication
De gauche à droite
6 a + b
a - b

Soustraction d' addition
De gauche à droite
sept <<
>>
Décalage gauche au
niveau du bit Décalage à droite au niveau du bit
De gauche à droite
8 <= < Opérateur de comparaison à trois voies De gauche à droite
9 <
<=
>
> =
Inférieur à
Inférieur ou égal à
Supérieur à
Supérieur ou égal à
De gauche à droite
dix ==
! =
Égal à
Non égal à
De gauche à droite
11 & ET au niveau du bit De gauche à droite
12 ^ XOR au niveau du bit De gauche à droite
13 | OU au niveau du bit De gauche à droite
14 && ET logique De gauche à droite
15 || OU logique De gauche à droite
16 une ? b: c
jette
co_yield
=
+ =
- =
* =
/ =
% =
<< =
>> =
& =
=
| =
Expression de rendement de l'
opérateur de jet conditionnel ternaire
(C ++ 20)
Assignation
Addition Assignation
Soustraction Assignation
Multiplication Assignation
Division Assignation Assignation du
module Affectation du module
Décalage au niveau du bit Décalage à gauche Affectation au
niveau du bit Décalage à droite Affectation au
niveau du bit ET Affectation
du XOR au
niveau du bit Affectation OR au niveau du bit
De droite à gauche
17 , Opérateur virgule De gauche à droite

Associativité des opérateurs C ++

L'associativité des opérateurs est la direction à partir de laquelle une expression est évaluée. Par exemple,

 int a = 1; int b = 4; // a will be 4 a = b;

Jetez un œil à la a = 4;déclaration. L'associativité de l' =opérateur est de droite à gauche. Par conséquent, la valeur de b est attribuée à a, et non dans l'autre sens.

De plus, plusieurs opérateurs peuvent avoir le même niveau de priorité (comme nous pouvons le voir dans le tableau ci-dessus). Lorsque plusieurs opérateurs du même niveau de priorité sont utilisés dans une expression, ils sont évalués en fonction de leur associativité .

 int a = 1; int b = 4; b += a -= 6;

Les opérateurs +=et les -=opérateurs ont la même priorité. Puisque l'associativité de ces opérateurs est de droite à gauche, voici comment la dernière instruction est évaluée.

  • a -= 6est évalué en premier. Par conséquent, un sera -5
  • Ensuite, b += -5sera évalué. Par conséquent, b sera -1

Exemple 2: Associativité des opérateurs

 #include using namespace std; int main() ( int a = 1; int b = 4; // a -= 6 is evaluated first b += a -= 6; cout << "a = " << a << endl; ; cout << "b = " << b; )

Production

 a = -5 b = -1

Articles intéressants...