Operators


To translate this course in your native langage:

  • In Chrome: right-click anywhere on the page and select “Translate to…”

  • Or use this language selector:

Les mots colorés en anglais représentent des mots-clés de la norme du langage C++. Ils sont conservés à l’identique lors de l’utilisation d’une traduction automatique avec Google Translate. Exemple : l’héritage (inheritance) est un principe fondamental de C++.


Le langage C++

Dans un programme C++, on rencontre plusieurs grandes catégories d’éléments :

  • Des opérateurs (operator) comme +, - ou <

  • Des structures de contrôle (control statement) : if, for…

  • Des littéraux (literals) comme 42, 3.14, “a”, « Bonjour », true qui représentent des valeurs directement écrites dans le code

  • Des symboles de ponctuation (punctuators) comme ; ( ) et { } qui structurent le programme

  • Des commentaires (comments)

Les opérateurs arithmétiques

La logique que nous allons voir dans ce chapitre fonctionne de manière similaire à ce que nous connaissons déjà en mathématiques. En effet, une opération mathématique prend une ou plusieurs valeurs, appelées opérandes (operand) et produit une nouvelle valeur en sortie. Voici un exemple pour l’addition, examinez ce tableau car nous allons reprendre ce format de présentation par la suite :


Opérateur

Symbole

Exemple

Opérandes

Résultat

Opérateur + d’addition arithmétique

Addition operator

+

4+x

Gauche : le littéral 4

Droite : la variable x

la somme de 4 et de la valeur de x


Lorsque l’on regroupe plusieurs opérations dans une seule ligne, éventuellement en ajoutant des parenthèses, on obtient une expression (expression) ; par exemple : 4 × (3 + x). Une expression peut inclure des variables mais aussi des appels de fonctions : sin(4 × (3 + x))+sqrt(x).

Les opérateurs

Opérateur vs fonction

La distinction entre fonction et opérateur est fine car ces deux notions sont proches, cependant :

  • Si l’opération est intégrée dans le langage C++, on parle d’opérateur : +, *, / …

  • Si l’opération est définie dans le programme ou fournie par une bibliothèque, on parle de fonction : sin(), cos(), sqrt()…

Terminologie

On parle de :

  • Opérateur binaire (binary operator) : lorsque l’opérateur accepte deux opérandes comme dans le cas des opérateurs arithmétiques.

  • Opérateur unaire (unary operator) : lorsque l’opérateur accepte une seule opérande.

Les opérateurs unaires les plus connus sont :

  • L’opérateur ++ servant à incrémenter une variable

  • L’opérateur ! servant à la négation dans une condition

Remarque : le même signe peut être associé à plusieurs opérateurs, par exemple :

  • L’opérateur binaire - présent dans l’écriture a-5

  • L’opérateur unaire - présent dans l’écriture a = -b

Logique

Les opérateurs du C++ ne se limitent pas aux calculs, ils forment une famille bien plus large. Ainsi, la plupart des syntaxes que vous utilisez correspondent en réalité à des opérateurs. Voici quelques exemples :


Opérateur

Symbole

Exemple

Opérandes

Résultat

Opérateur d'appel de fonction

Function call operator

( )

sin(2)

Gauche : le nom de la fonction

Droite : le littéral 2

La valeur renvoyée par la fonction sin()

Opérateur d’indexation

Subscript operator

[]

T[4]

Gauche : un tableau

Droite : un indice

La valeur située à l’indice indiqué dans le tableau

Opérateur d’accès aux membres

Member access operator

.

cercle1.rayon

Gauche : un objet

Droite : le nom d’un membre

La valeur de ce membre

Opérateur de résolution de portée

Scope resolution operator

::

std::cout

Gauche : un espace de noms (ici std)

Droite : le nom d’un membre (ici cout)

Le membre cout de l’espace de noms std

Opérateur d'affectation

Assignment operator

=

a = 4;

Gauche : la variable a

Droite : le littéral 4

Stocke la valeur 4 dans a

Retourne l’opérande de droite


Fait amusant : l’opérateur d’affectation = renvoie comme valeur l’opérande de droite. Quel est l’intérêt ? Prenez cela comme une anecdote, c’est ce qui permet à l’écriture a = b = 4 de fonctionner. Ainsi, la première affectation (b=4) retourne la valeur 4 et l’injecte vers la 2ème affectation a=….

Expression

Une expression (expression) est une combinaison de littéraux, de variables, d’opérateurs et d’appels de fonctions que le langage évalue pour produire un résultat. La valeur obtenue posséde un type, on peut donc par extension parler du type d’une expression.

Au même titre que 2 + 4, les écritures suivantes sont également des expressions :

42

x

++i

tab[i + 1]

std::cin

a = 4

x > y && x < z

!trouve

(a + b) * c

matrice[i][j]

new Cercle()

x += 5

Indiquez si les affirmations suivantes sont vraies ou fausses :

  • Un opérateur unaire possède un seul paramètre.

  • Un opérateur se comporte comme une fonction.

  • Un opérateur binaire retourne un résultat binaire true/false.

  • Les opérations mathématiques sont traitées comme des opérateurs.

  • Une opérande désigne un appel de fonction.

  • Un opérateur binaire s’applique uniquement sur des valeurs binaires.

  • Dans une expression, on peut trouver des variables, des littéraux, des appels de fonctions.

  • L’instruction if (…) est une expression conditionnelle.

  • L’écriture a=toto() est une expression.

  • L’évaluation consiste à déterminer le résultat d’une expression.

Ne pas utiliser de majuscules dans la suite :

  • Donnez le nom de cet opérateur : a=4 :

  • Donnez le nom de cet opérateur : a[4] :

  • Donnez le nom de cet opérateur : v.dr :

Principe de fonctionnement

Le langage C++ s’articule autours des opérateurs.

La priorité des opérateurs

A chaque opérateur du C++ est associé un niveau de priorité (operator precedence). Par convention, un opérateur de priorité 1 est évalué en premier. Ainsi, l’opérateur d’addition avec une priorité de 6 est moins prioritaire que la multiplication avec une priorité de 5. De cette façon, dans l’expression 3*6+7, l’évaluation effectue le calcul suivant : (3*6)+7.

Note

L’opérateur d’appel de fonction () a une priorité de niveau 2, soit quasiment la haute priorité du langage.

L’utilisation des parenthèses

Il est possible d’utiliser une paire de parenthèses dans une expression. Ces parenthèses ne correspondent pas à un opérateur du C++ à proprement parler. Elles ont pour rôle de définir une sous-expression à l’intérieur de l’expression courante. Ainsi, l’expression entre parenthèses est d’abord évaluée et son résultat est ensuite transmis à l’expression principale.

Le sens d’évaluation

Lorsque l’on trouve une expression contenant des + et des - comme dans 3-6+7-4, il faut savoir dans quel ordre sont effectués les calculs. En effet, le résultat de 3-((6+7)-4) n’a rien à voir avec celui de (3-6)+(7-4). Comme les les opérateurs + et - ont des priorités équivalentes, on applique la règle suivante : lorsque deux opérateurs ont des priorités équivalentes, l’évaluation se fait de gauche à droite (Left-to-right evaluation). Ainsi, c’est le sens de lecture (de gauche à droite) qui guide les calculs. Dans l’expression 3-6+7-4, le calcul effectué est donc : (((3-6)+7)-4).

Note

Il existe quelques opérateurs dont l’évaluation se fait de droite à gauche ! Pour les connaître, vous pouvez rechercher les opérateurs dont l’associativité se fait de droite à gauche. On peut citer par exemple l’opérateur d’affectation =. Ainsi dans l’écriture a=b=3, il faut bien effectuer en premier b=3 et ensuite a=… et non l’inverse.

L’opérateur modulo désigne le reste de la division de a par b, par exemple 8%5 = 3 ou encore 16%5=1.

Pour chacune des expressions, donnez sa valeur :

Expression

Valeur

2 + 3 * 2

2 + ( 5 % 2 )

(4+5)*7

(1+3)*(4+5)

5+2-3+6-8

(4*3+2)-(3*2+2)

Priorité des opérateurs

A titre indicatif, nous présentons la priorité des principaux opérateurs :

Priorité

Opérateur

Nom

1

::

Résolution de portée

2

a++ a--

Opérateurs de post incrémentation/décrémentation

a()

Opérateur d’appel de fonction

a[]

Opérateur d'indexation

3

++a --a

Opérateurs de pré incrémentation/décrémentation

-a

Opérateur moins unaire

!

Opérateur NON logique

5

a*b a/b a%b

Opérateurs arithmétiques : multiplication division modulo

6

a+b a-b

Opérateurs arithmétiques : addition et soustraction

9

< <= > >=

Opérateurs de comparaison

10

== !=

Opérateurs d’égalité et de différence

14

&&

Opérateur ET logique

15

||

Opérateur OU logique

16

= += -= *= /=

Opérateurs d’affectations

Pour terminer

Opérateurs d’affectation

Parmi les opérateurs d’affectation, on trouve +=, -=, *= ou encore /=. Ces opérateurs permettent une écriture plus compacte et plus lisible du code. Nous vous conseillons donc de les utiliser.

Sachant que la variable a vaut 5, donnez sa valeur après l’évaluation de chaque affectation :

Expression

Valeur

a += 3

a -= 2

a *= 2+1

Opérateurs de pré/post incrémentation

Une variable est dite incrémentée lorsque sa valeur est augmentée de 1.

Nous présentons :

  • l’opérateur ++x appelé opérateur de pré-incrémentation (pre-increment operator)

  • l’opérateur x++ appelé opérateur de post-incrémentation (post-increment operator)

Ces deux opérateurs ++ s’appliquent uniquement sur des variables. L’écriture 4++ est une erreur.

Ces deux opérateurs ont pour objectif d’incrémenter la variable x, ils se distinguent uniquement par le résultat retourné :

  • ++x retourne la variable x dont la valeur a été incrémentée

  • x++ retourne la valeur initiale de x, avant son incrémentation

Dans la pratique, vous pouvez utiliser uniquement l’écriture x++. Cependant, en lisant des exemples, vous trouverez les deux écritures.

Sachant que la variable a vaut 5 avant l’exécution de chaque ligne, donnez l’affichage ainsi que la valeur de a après l’exécution :

Code

Affichage

Valeur de a après l’exécution

std::cout << a++;

std::cout << a--;

std::cout << --a;

std::cout << ++a;

Note

Pour l’opérateur de pré-incrémentation, le type de retour est un référence sur la variable courante. Ceci permet de chaîner cet opérateur, l’écriture ++++a est donc possible bien que peu lisible. Pour l’opérateur de post-incrémentation, le type de retour étant une valeur, cela ne permet pas de chaîner cet opérateur : l’écriture a++++ est incorrecte. Respirez et relisez ce passage :)