Essayer de coder ← Retour aux sujets

if / else if / else

branchement

Une condition est fausse si elle vaut 0, vraie pour toute autre valeur. Les comparaisons donnent 1 ou 0.

if (n > 0) { … }
Exécuté seulement si la condition est vraie
else if (n < 0) { … }
Testé seulement si les conditions précédentes sont fausses
else { … }
Tous les autres cas
== != < <= > >=
Comparaisons
&& || !
ET, OU, NON logiques
if (n) { … }
Équivaut à if (n != 0)
signe.c
#include <stdio.h>

int main(void) {
    int n = -4;

    if (n > 0) {
        printf("positif\n");
    } else if (n < 0) {
        printf("negatif\n");
    } else {
        printf("nul\n");
    }
    return 0;
}
Affichage
negatif

switch et opérateur ternaire

switch · ?:

switch aiguille selon la valeur d'un entier ou d'un caractère ; ?: choisit entre deux valeurs en une seule expression.

switch (choix) { … }
Compare choix à chaque case
case 1: … break;
break sort du switch (sinon l'exécution continue)
default: …
Cas par défaut (facultatif)
max = (a > b) ? a : b;
Ternaire : condition ? si_vrai : si_faux
jour.c
#include <stdio.h>

int main(void) {
    int jour = 3;

    switch (jour) {
        case 1:
            printf("lundi\n");
            break;
        case 2:
            printf("mardi\n");
            break;
        case 3:
            printf("mercredi\n");
            break;
        default:
            printf("autre jour\n");
    }
    return 0;
}
Affichage
mercredi

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

vrai_faux.c
#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;
}
Affichage
1
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érateurSensExemple
==égal àa == b
!=différent dea != b
< <=inférieur (ou égal)age < 18
> >=supérieur (ou égal)note >= 10
&&ET logiquea > 0 && a < 10
||OU logiquec == '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.

mention.c
#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;
}
Affichage
Bien

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.

bissextile.c
#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;
}
Affichage
2024 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.

court_circuit.c
#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;
}
Affichage
division evitee

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.

saison.c
#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;
}
Affichage
hiver

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.

ternaire.c
#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;
}
Affichage
max = 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.

⚠️ Erreurs fréquentes

Écrire = à la place de ==

À éviter
faux.c
if (n = 0) { … }   /* affecte 0 à n : toujours faux */
Correct
correct.c
if (n == 0) { … }  /* compare n à 0 */

= affecte, == compare. Avec if (n = 5), le programme met 5 dans n, puis teste la valeur 5 (donc vrai). Avec -Wall, le compilateur te prévient.

Un point-virgule juste après le if

À éviter
faux.c
if (n > 0);
{
    printf("positif\n");  /* toujours exécuté */
}
Correct
correct.c
if (n > 0) {
    printf("positif\n");
}

Le ; forme une instruction vide : le if ne contrôle plus rien, et le bloc qui suit s'exécute dans tous les cas.

Enchaîner les comparaisons comme en mathématiques

À éviter
faux.c
if (0 < x < 10) { … }       /* toujours vrai ! */
Correct
correct.c
if (0 < x && x < 10) { … }  /* x strictement entre 0 et 10 */

0 < x < 10 se lit (0 < x) < 10. Le résultat de 0 < x est 0 ou 1, qui sont tous deux inférieurs à 10 : la condition est toujours vraie.

Oublier le break dans un switch

À éviter
faux.c
switch (n) {          /* avec n = 1 */
    case 1: printf("un\n");
    case 2: printf("deux\n");
}
/* affiche un puis deux */
Correct
correct.c
switch (n) {          /* avec n = 1 */
    case 1: printf("un\n"); break;
    case 2: printf("deux\n"); break;
}
/* affiche un */

Comparer des réels ou des chaînes avec ==

0.1 + 0.2 == 0.3 est faux : les réels sont stockés en binaire avec une petite erreur d'arrondi. Compare plutôt la différence à une tolérance, par exemple fabs(a - b) < 1e-9 (fonction de math.h). Et nom == "Lina" compare des adresses, pas le texte : utilise strcmp(nom, "Lina") == 0 (voir Chaînes de caractères).

📋 Aide-mémoire

  • 0 = faux, tout le reste = vrai ; une comparaison vaut 1 ou 0.
  • if / else if / else : le premier test vrai gagne ; mets toujours les accolades.
  • && (ET), || (OU), ! (NON) : ! avant && avant || ; l'évaluation s'arrête dès que le résultat est connu.
  • switch : constantes entières uniquement, break à la fin de chaque cas, default pour le reste.
  • cond ? a : b : une expression qui choisit entre deux valeurs.
  • = affecte, == compare ; jamais de ; après if (…).