Adloun

informatique (MP2I/MPI) · Chapitre 1 · Exercice de TD

L'ordre des conditions protège un accès

Le langage C · niveau 2

Énoncé

Ces deux fonctions sont-elles équivalentes ? Si non, laquelle est correcte, et pourquoi ?


bool premier_nul_A(const int t[], int n, int i) {
    return t[i] == 0 && i < n;
}
bool premier_nul_B(const int t[], int n, int i) {
    return i < n && t[i] == 0;
}

Corrigé

Elles ne sont pas équivalentes, et seule premier_nul_B est correcte.

L'évaluation de && est paresseuse : le second opérande n'est évalué que si le premier est vrai.

  • Dans B, si , l'expression vaut false sans que t[i] soit jamais lu. L'ordre protège l'accès.
  • Dans A, t[i] est lu avant le test de borne. Pour , c'est un accès hors tableau — que le langage ne vérifie pas. Le programme lira une valeur quelconque, et pourra même planter.

Règle générale : dans une conjonction, la condition qui garde vient toujours en premier. C'est un usage de la paresse comme outil de correction, et non comme optimisation.

Exercices semblables

Le cours du chapitre · Tous les exercices du chapitre