Comme Lisp, et à la différence de certains autres langages (Pascal, CAML, Fortran), C ne dispose pas d'un type booléen, c'est-à-dire contenant les deux valeurs faux et vrai , ou 0 et 1. En C, une valeur << est vraie >> si elle est différente de zéro, elle << est fausse >> si elle est égale à zéro. La valeur logique d'une expression peut donc être calculée si le type de cette expression contient une valeur nulle (0) à laquelle toute autre valeur peut être comparée. C'est notamment le cas des types arithmétiques, mais aussi des types pointeurs.
Les opérateurs de comparaison sont : <
, <=
, >
,
>=
, ==
, !=
. Ces opérateurs retournent un entier,
0 ou 1, qui est interprété logiquement : la valeur de 1 == 2
est 0 (faux), celle de 2 == 2 est 1 (vrai).
Les opérateurs logiques sont la négation
!
, le << et >> &&
et le << ou >> ||
.
Les deux derniers ont la particularité d'être séquentiels , c'est-à-dire de donner lieu à une évaluation de gauche à droite :
&&
B est faux si A est faux, et vrai si
A et B sont vrais : B n'est pas évalué si A est faux
||
B est vrai si A est vrai, et faux si
A et B sont faux : B n'est pas évalué si A est vrai
&&
et ||
est différent de
celui des and et or de Pascal qui évaluent toujours
leurs deux arguments. Il permet d'écrire des tests de la forme :
if (x != 0 && 1/x < epsilon) { ... }
if (i > N || t[i] > A) { ... }
Une autre expression dont l'évaluation est séquentielle est l'expression conditionnelle, présente également en Lisp et en CAML, mais pas pas en Pascal ou en Fortran : l'évaluation de A ? B : C commence par évaluer A ; si sa valeur est vraie, alors B est évalué, sinon C est évalué. Par exemple, l'expression
x >= 0 ? x : -x
a pour valeur la valeur absolue de la valeur de x.
Par contre, il est important de savoir que l'ordre d'évaluation des autres expressions ainsi que des arguments dans les appels de fonction n'est pas déterminé. Il est donc erroné de supposer en général un ordre d'évaluation, par exemple de gauche à droite.
Voici un extrait du tableau des précédences pour les opérateurs arithmétiques, logiques, conditionnels :
Opérateurs | Associativité |
! + - (type) sizeof | droite à gauche |
---|---|
* / % | gauche à droite |
+ - | gauche à droite |
< < = = | gauche à droite |
== != | gauche à droite |
&& | gauche à droite |
|| | gauche à droite |
? : | droite à gauche |
x+y>z || x<0 && y<0
qui est analysée en :
((x+y)>z) || ((x<0) && (y<0))
L'opérateur conditionnel ayant la plus faible précédence, il n'est pas nécessaire de placer ses trois sous-expressions entre parenthèses. Il suffira d'écrire
n<=1 ? 1 : fib(n-1) + fib(n-2)
au lieu de
(n<=1) ? 1 : (fib(n-1) + fib(n-2))