📘 Le cours : décider en C
Un programme prend des décisions en évaluant des conditions. En C, il n'existe pas de type booléen obligatoire : une condition est simplement une expression qui donne un entier.
Vrai ou faux ?
Pour if, while, &&… la règle est unique : 0 est faux, toute autre valeur est vraie. Un opérateur de comparaison produit 1 (vrai) ou 0 (faux).
#include <stdio.h>
int main(void) {
printf("%d\n", 3 > 2); /* vrai : 1 */
printf("%d\n", 5 == 6); /* faux : 0 */
printf("%d\n", !0); /* le contraire de faux : 1 */
int n = 42;
if (n) { /* n != 0 : la condition est vraie */
printf("n est non nul\n");
}
return 0;
}
Affichage1
0
1
n est non nul
Depuis C99, #include <stdbool.h> fournit bool, true et false : le code est plus lisible, mais ce sont toujours des entiers (1 et 0).
Opérateurs de comparaison et opérateurs logiques
| Opérateur | Sens | Exemple |
== | égal à | a == b |
!= | différent de | a != b |
< <= | inférieur (ou égal) | age < 18 |
> >= | supérieur (ou égal) | note >= 10 |
&& | ET logique | a > 0 && a < 10 |
|| | OU logique | c == 'o' || c == 'O' |
! | NON logique | !(n % 2 == 0) |
! passe avant &&, qui passe avant ||. En cas de doute, ajoute des parenthèses : elles ne coûtent rien et évitent les erreurs de lecture.
if, else if, else
Les tests sont évalués dans l'ordre et le premier qui est vrai l'emporte : les suivants sont ignorés. Place donc les cas les plus restrictifs en premier.
#include <stdio.h>
int main(void) {
int note = 14;
if (note >= 16) {
printf("Tres bien\n");
} else if (note >= 12) {
printf("Bien\n");
} else if (note >= 10) {
printf("Passable\n");
} else {
printf("Insuffisant\n");
}
return 0;
}
Les accolades sont facultatives quand le bloc ne contient qu'une instruction, mais mets-les toujours : ajouter une deuxième ligne plus tard sans accolades est une source classique de bugs.
Combiner les conditions : ET, OU, NON
Une année est bissextile si elle est divisible par 4 et pas par 100, ou si elle est divisible par 400.
#include <stdio.h>
int main(void) {
int annee = 2024;
if ((annee % 4 == 0 && annee % 100 != 0) || annee % 400 == 0) {
printf("%d est bissextile\n", annee);
} else {
printf("%d n'est pas bissextile\n", annee);
}
return 0;
}
Affichage2024 est bissextile
Évaluation paresseuse (court-circuit)
&& et || arrêtent l'évaluation dès que le résultat est connu. C'est une protection précieuse : dans d != 0 && n / d > 2, la division n'est jamais calculée quand d vaut 0.
#include <stdio.h>
int main(void) {
int n = 10, d = 0;
if (d != 0 && n / d > 2) {
printf("grand quotient\n");
} else {
printf("division evitee\n");
}
return 0;
}
switch : un entier, plusieurs cas
switch ne compare qu'à des constantes entières (ou des caractères), jamais à des intervalles ni à des chaînes. Sans break, l'exécution continue dans le case suivant : c'est la « chute ». Elle est parfois voulue pour regrouper des cas.
#include <stdio.h>
int main(void) {
int mois = 2;
switch (mois) {
case 12:
case 1:
case 2:
printf("hiver\n");
break;
case 6:
case 7:
case 8:
printf("ete\n");
break;
default:
printf("entre-saison\n");
}
return 0;
}
L'opérateur ternaire
condition ? valeur_si_vrai : valeur_si_faux est une expression : elle produit une valeur qu'on range dans une variable ou qu'on passe à printf.
#include <stdio.h>
int main(void) {
int a = 4, b = 9;
int max = (a > b) ? a : b;
printf("max = %d\n", max);
printf("%d est %s\n", a, (a % 2 == 0) ? "pair" : "impair");
return 0;
}
Affichagemax = 9
4 est pair
Lisibilité
Le ternaire est pratique pour un choix simple. Dès que les branches deviennent longues ou imbriquées, passe à un if : on le relit beaucoup mieux.