Compilateurs
Après application poussée de la propagation de constantes, du repliement de constantes et de la suppression de code mort à la fonction ci-dessus, quelle valeur renvoie la fonction et quel code subsiste ?
int h(void) {
int a = 5;
int b = a * 3;
int c = b - a;
if (c > 100) return 0;
return c * 2;
}
- AElle renvoie toujours 20, et le test de l'instruction if est supprimé
- BElle renvoie toujours 0, et return c * 2 est supprimé
- CTous les calculs subsistent, et elle renvoie 20 ou 0 à l'exécution
Afficher la réponse et l'explication
Réponse : A. Elle renvoie toujours 20, et le test de l'instruction if est supprimé
En propageant a = 5, on replie b = 5 * 3 = 15 et c = 15 − 5 = 10. La condition c > 100 devient 10 > 100, toujours fausse ; la branche return 0, jamais exécutée, est supprimée comme code mort. Le return c * 2 restant donne 10 × 2 = 20, et la fonction se réduit à return 20;. La condition étant toujours fausse, elle ne renvoie jamais 0, et aucun calcul ni test n'est nécessaire à l'exécution.