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
falsesans quet[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.