Les expressions


Vous connaissez déjà tous les expressions mathématiques dans lesquelles on retrouve des nombres, des opérateurs de calculs (+,-,..) et des variables. Par exemple:

(a+b) × (a-17)

Dans les langages de programmation, on retrouve également cette notion d'expression sous une forme un peu différente et plus générale.

Une expression est une écriture possédant une valeur et un type, dans laquelle figurent (entre autres) des littéraux, des constantes, des opérateurs et des noms de variables.

Vous savez déjà ce que sont les variables. Par contre, nous n'avons pas encore défini les littéraux, les constantes et les opérateurs.

La valeur d'une expression est le résultat du calcul de cette expression en tenant compte des valeurs des variables qu'elle contient. Son type est le type du résultat.

Nous dirons qu'une expression est numérique si son type est un type numérique.

Par exemple, si Age est une variable de type int, l'écriture Age + 1, est une expression de type int et par conséquent, une expression numérique. Sa valeur est celle de la variable Age augmentée de 1.

Une expression peut faire intervenir plusieurs opérations. Par exemple:

  (Age + 1)*2

représente le double de la valeur de la variable Age augmentée de 1.

Voilà différentes valeurs des expressions Age+1 et (Age + 1)*2 pour différentes valeurs de la variable Age :

Age Age+1 (Age + 1)*2
10 11 22
0 1 2
43 44 88



Les littéraux

Un littéral est l'écriture de la valeur d'une variable. La manière d'écrire cette valeur dépend du type de variable considérée et détermine le type du littéral. Il y a donc des littéraux de type chaines de caractères, des littéraux de types numériques ... etc

L'écriture des littéraux obéit à un certain nombre de conventions qui dépendent du type et du langage de programmation. Nous présentons ici celles du langage C++.

Les littéraux numériques

Un littéral numérique représente la valeur d'un nombre.

Pour le compilateur C++, une suite de chiffres éventuellement précédée d'un signe - ou +, est considérée comme l'écriture de la valeur d'un nombre entier. Exemple de littéraux de ce type: 2015, -1961, + 1935.

Pour écrire des nombres non entiers on utilise le point (et non pas la virgule !). La partie entière du nombre est suivi d'un point, puis d'une autre suite de chiffres. Exemples: 213.141559, -5.33333

Pour pouvoir écrire des nombres très grands ou très petit, C++ autorise également la notation scientifique (voir codage par virgule flottante), avec la lettre e ou E pour désigner l'exposant. Par exemple 1.7 1030, s'écrit 1.7E+30 ou 1.7e+30.

Les littéraux de type chaine de caractères

En C++, un littéral de type chaine de caractères s'écrit entre guillemets.

Par exemple "Il fait beau", "4012", "(3 x + 1)", "VisualC++", "@%^¨¤" sont des littéraux de type chaine de caractères.

On remarquera que tous les caractères sont autorisés entre les guillemets sauf les guillemets eux mêmes !. Pour mettre un guillemet dans une chaine de caractères, il faut le faire précéder par un anti-slash (le caractère \).

Parmis les chaines de caractères, il y en a une qui joue un rôle particulier : la chaine vide.

La chaine vide est une chaine qui ne contient aucun caractères. On l'écrit "" (deux guillemets).

Les Constantes

Une constante est un littéral portant un nom.

Une constante est donc en quelque sorte le synonyme d'une valeur. On pourra par exemple introduire une constante PI représentant le nombre 3.14159.

Comme son nom l'indique, la valeur d'une constante ne peut pas varier durant l'exécution d'un programme.

Déclaration d'une constante en C++

En C++, une constante peut se déclarer de la manière suivante:

  const type de la constante nom de constante = littéral ;
 

Le nom d'une constante obéit aux même règles que le nom d'une variable.

Exemple
    const float PI = 3.14159 ;
    const string CLEF_USB = "F:", DISQUE_DUR = "C:"; 
 

Notez que les constantes de même type peuvent être regroupées dans une même déclaration en séparant les noms des constantes par des virgules.

Nous avons utilisé des lettres majuscules pour les constantes, afin de les distinguer immédiatemment des variables. En adoptant cette convention vous rendrez vos programmes plus lisibles.

Où faut-il déclarer les constantes ?

Comme pour la déclaration des variables, les déclarations de constantes peuvent figurer en de nombreux endroits d'un programme. Je vous propose de les déclarer avant le programme principal.

Operateur

En informatique, un opérateur est généralement représenté par un ou deux caractères représentant une certaine opération.

Voici par exemple, quelques opérateurs fréquement rencontrés dans les langages de programmation: +   -  /  *  ^  =  ++  !   %

Dans ce cours, nous nous concentrerons pour l'instant sur les opérateurs suivants:

Vous connaissez déjà les quatre premiers opérateurs puisqu'il s'agit des opérateurs mathématiques classiques. Mais si vous n'avez jamais fait de programmation, vous ignorez probalement le sens de l'opérateur de concaténation. Nous en reparlerons plus loin.

Les opérateurs précédents sont tous des opérateurs binaires, c'est à dire qu'ils nécessitent deux données pour effectuer l'opération correspondante. Ces deux données s'appellent les opérandes.

En C++, une des deux opérandes figure avant l'opérateur et l'autre après. Comme par exemple 2 + 7, 3 * 9, etc .. Lorsqu'on a un opérateur binaire, on a donc forcément une opérande gauche et une opérande droite. Cela vous paraitra certainement naturel, mais sachez que d'autres langages (comme Lisp par exemple) utilisent une notation préfixée. C'est à dire que l'on écrira l'opérateur avant les deux opérandes ( par exemple + 2 7 à la place de 2 + 7).

Nous verrons ultérieurement qu'il existe également des opérateur unaires, c'est à dire des opérateurs qui ne nécessitent qu'une seule opérande.

La division euclidienne

Attention à l'opérateur de division: il se comporte de manière différente selon le type des nombres à diviser. Si au moins un des deux nombres n'est pas un entier, ce sera la division habituelle. Par contre, si les deux nombres à diviser sont entier, cet opérateur effectue la division euclidienne (également appelée division entière) des deux nombres. Par exemple:

Si vous ne voulez pas avoir la division euclidienne, il suffit d'écrire un des deux nombres avec un point à la fin. Il ne sera alors pas considéré comme un nombre entier par le compilateur. Par exemple, 1 / 2. vaudra 0.5.

La concaténation
Concaténer deux chaines de caractères signifie les mettre bout à bout.

Par exemple, si je concatène la chaine "para" avec la chaine "pluie", j'obtient la chaine "parapluie".

La manière de noter l'opérateur de concaténation dépend des langages.

En C++, il se note comme l'opérateur d'addition, c'est à dire avec un signe +.

L'opérateur de concaténation permet de construire des expressions de type chaine de caractères.

Par exemple, "Je suis " + Prenom est une expression de type chaine de caractères constituée d'un littéral ("Je suis "), de l'opérateur de concaténation + et d'un nom de variable (Prenom).

On peut concaténer autant de chaines de caractères qu'on le souhaite. Par exemple, dans l'expression "Je suis "+Prenom+" "+Nom il y a quatre chaines de caractères.

Voilà différentes valeurs de l'expression

 "Je suis " + Prenom

pour différentes valeurs de la variable Prenom :

Prenom "Je suis "+Prenom
"Jimi" "Je suis Jimi"
"Albert" "Je suis Albert"

Voilà différentes valeurs de l'expression

 "Je suis " + Prenom + " " + Nom

pour différentes valeurs des variables Prenom et Nom :

Prenom Nom "Je suis "+Prenom+" "+Nom
"Jimi" "Hendrix" "Je suis Jimi Hendrix"
"Albert" "Einstein" "Je suis Albert Einstein"
"Albert" "" "Je suis Albert"

Validité d'une expression

L'écriture d'une expression dans un certain langage de programmation doit nécessairement obéir aux règles propres à ce langage.

Une expression de type T est valide si elle peut être "comprise" par l'interpréteur (ou le compilateur) comme un calcul d'une valeur de type T ou plus généralement comme la construction d'un objet de type T.

Nous donnons ici, un certain nombre de règles non exhaustives permettant d'écrire des expressions valides en C++.

Expressions valides de type chaine de caractères

Les règles suivantes permettent de construire des expressions de type chaine de caractères valides:


Règle1: un nom de variable est une expression valide de type chaine de caractères si et seulement cette variable est de type chaine de caractères.

Règle2:un littéral (ou une constante représentant ce littéral) est une expression valide de type chaine de caractères si et seulement si il est du type chaine de caractères.

Règle3: A+B est une expression valide de type chaine de caractères si et seulement si A et B sont deux expressions valides de type chaine de caractères.

Règle4: un littéral, une constante ou un nom de variable ne peut pas être suivi immédiatement d'un littéral, d'une constante ou d'un nom de variable.

Exemples d'application de ces règles (Nom et Prenom sont des variable de type String et Age est une variable de type int):

Expression Validité Règle non respectée
Prenom Oui
Age Non 1
"Thirion" Oui
48 Non 2
"Eric "+"Thirion" Oui
Prenom+Nom Oui
Prenom+" Thirion" Oui
"Cours de "+Prenom+" Thirion" Oui
"Eric Thirion a" +Age+" ans" Non 3
"Eric Thirion a" + 57 +" ans" Non 3
Prenom Nom Non 4
"Eric" "Thirion" Non 4
Prenom "Thirion" Non 4
Expressions valides de type numérique

Les règles suivantes (non exhaustives) permettent de construire des expressions numériques valides:


Règle1: une variable est une expression numérique valide si et seulement si elle est de type numérique (int ou float par exemple).

Règle2:un littéral (ou une constante représentant ce littéral) est une expression numérique valide si et seulement si il est de type numérique.

Règle3: les écritures A+B, A-B, A*B, A/B sont des expressions numériques valides, si et seulement si A et B sont des expressions numériques valides.

Règle4: un littéral, une constante ou un nom de variable ne peut pas être suivi immédiatement d'un littéral, d'une constante ou d'un nom de variable.

Règle5: (A) est une expression numérique valide si et seulement si A est une expression numérique valide.

Règle6: chaque parenthèse ouvrante correspond à une et une seule parenthèse fermante.

Exemples d'application de ces règles (avec Nom de type string, Age de type Integer et Poids de type float):

Expression Validité Règle non respectée
Nom Non 1
Age Oui
201 Oui
20.14 Oui
"20.14" Non 2
Age * Poids Oui
Age + Nom Non 3
Poids/(Age*2.2) Oui
Age Poids Non 4
Age 49 Non 4
(Age * Poids) Oui
(Age * Nom) Non 5
(Poids/((Age*(2.2))) Oui
Poids/((Age + 1 ) Non 6