Compilateurs
En C, le débordement d'un entier signé est un comportement indéfini. Sur cette base, quel code un compilateur optimisant la fonction ci-dessus peut-il générer ?
int f(int x) {
return x + 1 > x;
}
- AIl conserve obligatoirement la comparaison pour renvoyer 0 uniquement lorsque x est à sa valeur maximale
- BIl la remplace par un code renvoyant toujours 1
- CComportant un comportement indéfini, la compilation est interrompue avec une erreur
Afficher la réponse et l'explication
Réponse : B. Il la remplace par un code renvoyant toujours 1
Le débordement d'un entier signé étant un comportement indéfini, le compilateur est autorisé à supposer que « dans un programme correct, aucun débordement ne se produit ». Sous cette hypothèse, x + 1 est toujours supérieur à x ; la comparaison peut être omise et le code peut renvoyer toujours 1. Un code qui attend 0 lorsque x est à sa valeur maximale peut cesser de fonctionner comme prévu avec cette optimisation. Le comportement indéfini n'est généralement pas détecté à la compilation et ne provoque pas d'erreur.