next up previous contents index
Next: Instruction conditionnelle if Up: No Title Previous: Expressions arithmétiques

Expressions logiques

    

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 :  

Ce comportement des opérateurs && 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é
! +$_{\mathsf{un}}$ -$_{\mathsf{un}}$ (type) sizeof droite à gauche
* / % gauche à droite
+ - gauche à droite
< < = = gauche à droite
== != gauche à droite
&& gauche à droite
|| gauche à droite
? : droite à gauche
On retiendra l'ordre : opérateurs arithmétiques, opérateurs de comparaison, opérateurs logiques, qui permet d'écrire sans parenthèse l'expression logique

  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))

next up previous contents index
Next: Instruction conditionnelle if Up: No Title Previous: Expressions arithmétiques
Jean-Philippe Chancelier
9/29/1998