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 * 6
est évalué en premier.
Par conséquent, l'expression ci-dessus équivaut à
int x = 5 - (17 * 6);
Si nous souhaitons évaluer d' 5 - 17
abord, 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 -= 6
est évalué en premier. Par conséquent, un sera -5- Ensuite,
b += -5
sera é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