Logo du langage C

Introduction à la programmation - Le langage C - Les conditions


Bonjour et bienvenue dans ce nouveau tutoriel,

Aujourd'hui nous allons aborder une notion simple que vous allez utiliser très souvent : les conditions.

Comme le nom l'indique, les conditions vont vous permettre de développer la logique de vos applications et programmes. Prenons par exemple une lampe domotisée qui doit s'allumer automatiquement la nuit. Humainement, le code ressemblera à ceci :

Je regarde l'état de la journée. S'il fait nuit, j'allume la lumière, sinon j'éteins la lumière.

Dans ce tutoriel nous allons aborder les notions suivantes :

Le "si" en C : "if"

La première instruction conditionnelle à connaitre en C est le "si", elle s'utilise avec le mot-clef "if" de cette manière :

#include <stdbool.h>
#include <stdio.h>

int main(void)
{
bool faitIlNuit = true;

if (faitIlNuit)
{
printf("Il faut allumer la lumière\n");
}
return 0;
}

Le message "Il faut allumer la lumière" dans le code ci-dessus ne s'affichera que si la condition écrite dans le if est vraie. Ici il s'agit de vérifier que la valeur de la variable "faitIlNuit" vaut "vrai" ("true" en anglais). C'est le cas, le message sera donc écrit.

Lorsqu'une condition est vérifiée, les instructions écrites entre les accolades suivantes seront exécutées.

Si vous oubliez les accolades après une déclaration de condition ("if"), le code compilera mais seule la première ligne d'instructions sera exécutée si la condition est vraie, le reste sera exécuté quelque soit le résultat du test.

Nous allons à présent voir les différentes manières d'exprimer un test conditionnel et les résultats possibles en C.

Les types d'expressions conditionnelles en C

ExpressionDescriptionExemple
VariableUne valeur numérique de 0 contenue dans une variable signifie "faux" en C, toutes les autres valeurs signifient "vrai"
if (a)
== (Égalité)Retourne vrai si les deux valeurs sont identiques, sinon retourne faux. Les valeurs comparées peuvent être contenues dans des variables.
Même si cela compilera, il n'est pas possible de comparer des chaînes de caractères en C avec cet opérateur. La comparaison s'effectuera en réalité sur les adresses en mémoire où se trouvent ces chaînes. C'est l'un des plus gros pièges du C
if (a == 42)
!= (Différence)Possède le même fonctionnement que l'égalité sauf que la réussite du test se produit cette fois-ci lorsque les deux valeurs sont différentes
if (a != 42)
< (Infériorité)Retourne vrai si la valeur précédent le symbole "<" est strictement inférieure à celle suivant ce symbole, sinon retourne faux
if (21 < 42)
> (Supériorité)Retourne vrai si la valeur précédent le symbole ">" est strictement supérieure à celle suivant ce symbole, sinon retourne faux
if (42 > 21)
< (Infériorité ou Égalité)Retourne vrai si la valeur précédent le symbole "<=" est inférieure ou égale à celle suivant ce symbole, sinon retourne faux
if (21 <= 42)
> (Supériorité ou Égalité)Retourne vrai si la valeur précédent le symbole ">=" est supérieure ou égale à celle suivant ce symbole, sinon retourne faux
if (42 >= 21)
&& (ET logique)Cet opérateur sert à ajouter une expression conditionnelle supplémentaire devant réussir. Par exemple si vous voulez vérifier qu'un nombre est compris entre deux valeurs, il doit obligatoirement être supérieur à la plus petite et inférieur à la plus grande et non pas ne remplir qu'une des deux conditions
if (a >= 'a' && a <= 'z')
// Le test n'est vérifié que si a est une lettre
// comprise entre 'a' et 'z' inclus
|| (OU logique)Cet opérateur sert à ajouter une expression conditionnelle optionnelle, c'est à dire qu'elle n'est exécutée que si toutes les expressions précédentes séparées par des "||" ont échouées. La réussite d'une seule de ces expressions est nécessaire pour valider le test conditionnel
if (a == 'a' || a == 'z')
// Le test n'est vérifié que si a est une lettre
// valant 'a' ou 'z'
! (Inversion)Permet d'inverser le résultat du test conditionnel suivant cet opérateur. Ainsi une réussite devient un échec et inversement
if (!(42 == 42))
// Est faux, le code ne s'exécutera pas

Il est possible de regrouper plusieurs expressions conditionnelles à l'intérieur de parenthèses pour contrôler l'ordre de traitement au lieu qu'elles soient vérifiées dans l'ordre lecture.

Voici un petit exemple d'imbrications de tests :

if (a >= b && (a == 255 || a == 2048))
/* La condition est vérifiée ainsi :
 * 1) Si a est supérieur à b ET
 * 2) Si a est égal à 255 OU a est égal à 2048
 */

Le "sinon si" en C : "else if"

Le "sinon si" en C s'utilise obligatoirement après un "si" ou un autre "sinon si" de la même manière que le "si", la seule différence étant que la condition n'est vérifiée que si les conditions précédentes ont échoué.

Voici ci-dessous un petit exemple d'utilisation :

if (21 == 42) // La condition échoue
printf("Ce n'est pas possible\n");
else if (21 < 42) // La condition réussie
printf("21 est plus petit que 42\n");
else if (21 == 21) // La condition n'est pas testée puisque la précédente à réussie
printf("Je ne suis pas exécuté\n");

Le "sinon" en C : "else"

Le "sinon" en C ne peut s'utiliser qu'après un "si" ou un "sinon si" et permet de définir un bloc d'instructions à exécuter si toutes les conditions testées précédemment ont échouées.

Ci-dessous un dernier petit exemple répitulant tout ce que nous venons de voir :

int luminosite = 20;

if (luminosite > 2048) // la condition échoue
rechargerBatterie(); // Lorsqu'il n'y a qu'une seule ligne d'instructions, les accolades ne sont pas obligatoires
else if (luminosite > 100 && luminosite <= 2048) // la condition échoue
{ // Il y a plus d'une instruction, les accolades sont donc nécessaires
tournerPanneauSolaireVersLeSoleil();
rechargerBatterie();
}
else // Puisque les conditions ont échouées, le code par défaut est exécuté
allumerLumiere();

Maintenant que vous savez conditionner l'exécution des différentes parties de vos programmes, nous verrons la prochaine fois comment répéter l'exécution d'instructions en utilisant des boucles.

À très bientôt


Publié le 13/10/2016