Les expressions sont elles aussi de plusieurs types. Les expressions
arithmétiques font intervenir les opérateurs classiques sur les
entiers + (addition), - (soustraction), *
(multiplication), div (division entière), mod (modulo).
On utilise les parenthèses comme en mathématiques standard. Ainsi,
si x et y sont deux variables entières, on peut écrire
3 * (x + 2 * y) + 2 * x * x pour
.
De même, les mêmes opérateurs peuvent servir pour les expressions
réelles, à l'exception de la division qui se note /. Donc si
z et t sont deux variables réelles, on peut écrire
3 * (z + 1) / 2 pour
. Il y a les fonctions
trunc et round de conversion des réels dans les
entiers: la première donne la partie entière, la seconde l'entier le
plus proche. Réciproquement, les entiers sont considérés comme un
sous-ensemble des réels, et on peut écrire librement 3.5 + (x
div 2).
On peut aussi faire des expressions booléennes, à partir des
opérateurs or, and, not. Ainsi si b
etc sont deux variables booléennes, l'expression
(b and not c) or (not b and c)
représente le ou-exclusif de b et c. (On peut
aussi l'écrire simplement b <> c).
Il existe aussi des opérateurs plus hétérogènes. Ainsi, les
opérateurs de comparaison =, <>, <=, <,
>, >= rendent des valeurs booléennes. On peut comparer
des entiers, des réels, des booléens, des caractères (dans ce
dernier cas, l'ordre est celui du code ASCII).
La précédence des opérateurs est relativement naturelle. Ainsi
* est plus prioritaire que +, lui-même plus prioritaire
que =. Si un doute existe, il ne faut pas hésiter à mettre
des parenthèses. Il faut faire attention dans les expressions
booléennes, et bien mettre des parenthèses autour des expressions
atomiques booléennes, comme dans:
if (x > 1) and (y = 3) then ...
L'ordre d'évaluation des opérateurs dans les expressions est
malheureusement très simple. Ainsi, dans
, on
évalue d'abord
et
donnant les valeurs
et
,
puis on évalue
. Ceci veut donc dire que si
l'évaluation de
ou
se passe mal (non terminaison, erreur
de type à l'exécution), l'évaluation de
se
passera mal également. Cette remarque sera particulièrement gênante
quand on fera de la recherche dans une table a, où on voudra
écrire typiquement une boucle du genre
while (i <= TailleMax) and (a[i] <> v) do ...
Cette écriture sera interdite, puisqu'on devra évaluer
toujours les deux arguments de l'opérateur and, même dans le
cas où on finit avec
et
a[i] alors indéfini. Pascal, contrairement au langage C, devra
tourner autour de cette difficulté avec des booléens, sentinelles ou
autres instructions goto. Si l'on veut rester portable, il ne
faut pas utiliser les particularités de certains Pascal (Think)
qui évaluent leurs expressions booléennes de la gauche vers la
droite contrairement à la définition standard.