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 : <, <=, >, >=, ==, !=gif. 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 :     l'évaluation de A ? B : C commence par évaluer A ; si sa valeur est vraie, alors B est évalué, sinon C est évalué.

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 :

tabular508

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

Rene Lalement
Mon Sep 30 18:22:54 MET 1996