Cours 3.12. Priorité des opérateurs

Sauriez-vous, de façon catégorique, déterminer ce que contiendra la variable x ?

x =  3 * 2 < 4;

La question soulevée ici est de savoir quel opérateur sera exécuté en premier : la multiplication ou la comparaison ? Il existe un tableau des priorités des opérateurs représenté ci-dessous. Vous pourrez y constater que la multipication (priorité 3) est prioritaire sur la comparaison (priorité 6) :

Tableau de priorité des opérateurs

Priorité Opérateurs Description Associativité
1 ++     -- Pré-incrémentation et pré-décrémentation Associativité ![Associativité de la gauche vers la droite](../files/right-arrow.png)
2 !     ~     +     - Opérateurs unaires Associativité de la droite vers la gauche
3 *     /     % Multiplication, division et modulo Associativité ![Associativité de la gauche vers la droite](../files/right-arrow.png)
4 +     - Addition et soustraction Associativité de la gauche vers la droite
5 <<     >> Décalages Associativité de la gauche vers la droite
6 <     >     <=     >= Opérateurs de comparaison Associativité de la gauche vers la droite
7 ==     != Opérateurs d'égalité Associativité de la gauche vers la droite
8 & ET logique bit à bit Associativité de la gauche vers la droite
9 ^ OU exclusif bit à bit Associativité de la gauche vers la droite
10 | OU inclusif bit à bit Associativité de la gauche vers la droite
11 && ET logique Associativité de la gauche vers la droite
12 || OU logique Associativité de la gauche vers la droite
13 =     !=     +=     *=     &=     etc Opérateurs d'affectation Associativité de la droite vers la gauche
14 ++     -- Post-incrémentation et post-décrémentation Associativité de la droite vers la gauche

Associativité

Sauriez-vous, maintenant, donner avec certitude la valeur de x après ces lignes de code ?

int a=5, x;
x = a = 3;

Dans cet exemple, nous avons deux fois l'opérateur = dans la même instruction. Forcement, les deux opérateurs sont de même priorité. Mais heureusement, pour chaque opérateur est définie une associativité. C'est elle qui détermine en dernier recours l'ordre des opérateurs de même priorité. Dans la dernière colonne du tableau des priorités on s'aperçoit que l'associativité est définie de la droite vers la gauche pour l'opérateur =. Les instruction équivalentes sont donc :

int a=5, x;
a = 3;
x = a;

Évidemment, personne ne connait par coeur le tableau des priorités. Le plus simple, si vous avez un doute, est d'ajouter des parenthèses pour imposer l'ordre d'exécution des différents opérateurs. Cela facilite aussi la compréhension pour d'autres développeurs qui auraient à analyser votre code. Retenez simplement que les opérateurs multiplication et division sont prioritaires sur l'addition et la soustraction.

Exercice

Écrire un programme qui permet de calculer la valeur de x (éliminer les parenthèses superflues) :

$$ x = \dfrac{125,5+12,5}{5468,12} - 12,5*2,54 $$

Le résultat du calcul doit être -31.724763.

Quiz

Un opérateur de priorité 1 sera-t-il exécuté après un opérateur de priorité 2 ?

Vérifier Bravo ! Les opérateurs de grande priorité sont exécutés en premier. Essaie encore ...

Quand s'applique l'associativité ?

Vérifier Bravo ! Dès qu'il y a deux opérateurs de même priorité, l'associativité entre en jeu. Essaie encore ...

Comment écrire cette instruction pour qu'elle soit plus facile à interpréter ?

x = c > a * b;
Vérifier Bravo ! La multiplication est prioritaire sur la comparaison. Essaie encore ...

Comment écrire cette instruction pour qu'elle soit plus facile à interpréter ?

x = 3 * 2 && 0;
Vérifier Bravo ! Ici, x vaudra toujours 0 car le dernier opérateur exécuté sera toujours && 0. Essaie encore ...

Que vaudra la variable x ?

int a=3, x;
x = a += 5;
Vérifier Bravo ! L'opérateur += sera exécuté en premier car l'associativité est de droite à gauche. Essaie encore ...

Que vaudra la variable x ?

int a=3, x;
x = a == 5;
Vérifier Bravo ! L'opérateur == sera exécuté en premier et la comparaison retournera 0. Essaie encore ...

Que vaudra la variable x ?

int a=-3;
x = 0<a<20;
Vérifier Bravo ! Les comparaisons se feront de la gauche vers la droite : (0<-3)<20). Ce n'est pas la bonne façon de tester un interval. Essaie encore ...

Que vaudra la variable x ?

int a=-3;
x = 0<a && a<20;
Vérifier Bravo ! Les comparaisons seront exécutées avant l'opérateur logique. C'est la bonne façon de tester un interval. Essaie encore ...

Voir aussi


Dernière mise à jour : 30/09/2021