Instructions de contrôle

En C le type booléen n'existe pas (il existe cependant un typedef pour cela). Les tests qui résultent d'une condition booléenne comparent des entiers :

Outre l'utilisation d'entiers, on peut créer un booléen (0 ou 1) grâce aux opérateurs relationnels :

danger !

Les comparaisons ne fonctionnent pas avec des tableaux ou les chaînes de caractères.

Pour ces deux types, il peut utiliser des fonctions comme strcmp pour les chaines de caractères et memcmp pour comparer des plages de mémoire.

Combiner des conditions logiques se fait grâce aux opérateurs logiques :

Pour les conditions utiliser les opérateurs logiques.

danger !

Ne confondez pas && qui est la condition logique et & qui est la comparaison bit à bit (idem pour || et |).

Comme on compare des entiers, c'est souvent identique mais il existe des cas où le résultat va être différent, donc préférez les opérateurs logique lorsque vous faite de la logique.

If/else

if (condition) {
  // bloc if
} else {
  // bloc else
}

Le else est facultatif.

danger !

Un bloc en C est :

  • soit une instruction
  • soit des instructions entouré d'accolades

Il est donc techniquement possible d'écrire :


int i = -1;

if (i > 0) 
  printf("positif");

Ne le faites cependant pas, car souvent plus tard, on veut rajouter une ligne à cette condition et on écrira :


int i = -1;

if (i > 0) 
  printf("strictement");
  printf("positif");

Qui est faut (la seconde instruction ne fait pas partie du if) à la place de :


int i = -1;

if (i > 0) {
  printf("strictement");
  printf("positif");
}

Ce type de bug est très difficile à voir car l'œil est porté par les indentations et non les accolades...

EN conclusion : utilisez toujours des {} dans vos conditions.

La structure elif n'existe pas en C. On chaîne les tests :

if (condition) {
  // bloc if
} 
else if (condition2) {
  // bloc else if
} else {
  // bloc else
}

TBD exemple

Opérateur ternaire

condition ? expr1 : expr2;

Qui est équivalent à :

if (condition) {
  expr1
} else (
  expr2
)

Vous verrez souvent ce genre de construction incluse dans une autre instruction. Vois par exemple ce tutoriel.

TBD exercice

While

Deux flavors de while :

while (condition) {
  // bloc while
}

et :

do {
  // bloc do while
} while (condition)

TBD exemple

Boucle for

for (expr1 ; condition ; expr2) {
  // bloc for
}

Qui est équivalent à la structure while :

expr1;
while (condition) {
  
  // bloc for

  expr2;
}
for (size_t i = 0 ; i < 10 ; i++) {
  printf("%zu ", i);
}
printf("\n");

danger !

On se trompe rapidement dans l'ordre et les paramètres de la boucle for. Encore une fois le mieux qui peut vous arriver est une erreur :

  • l'échange de condition de fin et de test fonctionne de temps en temps
  • remplacer les ; par des , peut fonctionner (voir , est un opérateur en C)
  • oublier un paramètre fonctionne. Par exemple, ceci : for(;;) {} est parfaitement légitime...
  • etc

Bref, vérifier toujours deux fois vos boucles for.

Switch

L'instruction switch permet d'effectuer des actions différentes selon les modalités (discrètes) d'une variable

switch (expression){
    case constante1:
      // cas 1
      break;

    case constante2:
      // cas 2
      break;
    default:
      // par défaut
}

Si vous omettez le break, les instructions vont continuer. Exécutez par exemple le code ci-dessous puis supprimez les lignes 9 et 12.

#include 

int main() {
  int i = 0;
  switch (i)
  ​{
      case 0:
        printf("vaut 0\n");
        break;
      case 1:
        printf("vaut 1\n");
        break;
      default:
        printf("différent de 0 et 1\n");
  }
}

Break/continue

Comme en python :