# Introduction au langage C/Structures conditionnelles
## Introduction

Les structures de contrôle sont basées sur des tests logiques qui permettent :
* d'aiguiller le déroulement du programme vers un groupe d'instruction;
* de répéter un groupe d'instructions.
Elles sont composées de tests basés sur l'évaluation d'expressions logiques.
Conseils de codage à respecter : c_lis_13, c_lis_14, c_rec_11, c_rob_2.

## Les expressions logiques

Exemple en français : Si la pression dépasse 200 kPa alors faire … sinon faire … fin de la condition.
* En C, on utilise beaucoup l’algèbre de Boole; les variables logiques (vrai, faux) sont nommées booléennes. La norme C99 a introduit type _Bool pour définir un booléen. Auparavant, il n'existait pas de type spécifique. On utilisait des variables entières de type int.
* Une variable est considérée comme contenant une valeur fausse si elle vaut 0 ou NUL. Pour toutes les autres valeurs, elle est considérée comme contenant une valeur vraie.
* Une expression logique peut inclure des affectations de variables, des appels de fonctions, des comparaisons, des opérations logiques et arithmétiques… Il est important de bien parenthéser ces expressions et de ne pas en abuser pour préserver la lisibilité du programme. La confusion entre l'opérateur d'affectation = et l'opérateur de comparaison == est aussi une source fréquente d'erreurs.

## Tests logiques
### if … else …

Cette structure de contrôle permet de réaliser ou non une action, en fonction de la valeur d'une expression logique.
Un exemple :
Tout d’abord, dans ce code, il faut déclarer une variable, ici age, qui sera utilisée dans l’expression conditionnelle. Le programme demandera ensuite d'entrer un entier stocké dans cette variable.
La partie intéressante :
* On commence à tester la condition (age<18) avec l'instruction if.
* Si le résultat du test est vrai, on exécute le bloc d'instruction (entre) situé immédiatement après l'instruction if.
* Sinon on exécute le bloc précédé du mot-clé else. Ce bloc else est facultatif.

### switch … case … default

L'instruction switch permet de se brancher vers un endroit parmi plusieurs autres, en fonction de la valeur d'une expression.
exemple :
Remarques :
* L'instruction de contrôle (dans l'exemple, la variable a), doit être pouvoir être représentée par un entier (character, short integer, integer contenant des bits, pour tous signés ou non, ou une valeur définies dans une instruction enum); la conversion en entier donnera un int ou un unsigned int.
* L'instruction break garantit que l'exécution ne passera pas au case ou default suivant. Son oubli est une source d'erreur fréquente.
* La clause default sera exécutée si aucune constante des autres (case) précédent ne correspondait à la valeur de l’expression de contrôle; Si vous ne prévoyez pas de clause default, rien ne sera alors exécuté par l'instruction switch.

### Conditions ternaires

La structure if … else peut paraître longue pour des conditions très simple. Il existe en C des conditions ternaires dites condensées.
Format : (expression) ? expr₁ : expr₂
* expression est évaluée à l'exécution;
* si vraie (différente de 0), alors l’expression ternaire vaut expr₁
* sinon, elle vaut expr₂
Voici deux exemples d’utilisation :
Explications :
* La chaine str vaut "mineur" si la condition age < 18 est vraie, "majeur" sinon.
* La variable pression est affectée à 0.0 si la variable vide est vraie (différente de 0), sinon sa valeur est inchangée.

## Remarques qualités
### Blocs d'instructions

Dans une instruction de test if ou dans une structure itérative, si une seule instruction doit être exécutée, on pourrait ne pas la placer dans un bloc. Cependant cette pratique est déconseillée :
Programme d'origine (extrait) déconseillé :
Programme modifié par la suite :
Le programmeur a ajouté une instruction à la clause else, mais cette dernière sera exécutée que le test soit vrai ou faux et ce n’est pas ce qu’il souhaite !
Programme plus sûr :

### instruction switch

* Toute suite d'instruction d'une clause case devrait se terminer par un break.
* Toute instruction switch devrait se terminer par une clause default.