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;
}
  1. AIl conserve obligatoirement la comparaison pour renvoyer 0 uniquement lorsque x est à sa valeur maximale
  2. BIl la remplace par un code renvoyant toujours 1
  3. 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.

S'entraîner sur ce thème Retour au thème

Autres questions sur Compilateurs

  1. Parmi les erreurs de programme, laquelle peut être détectée dès la compilation ?
  2. Dans un langage à typage statique, quel est le principal avantage de la vérification des types par le compilateur ?
  3. Qu'utilise-t-on souvent pour exprimer les règles de reconnaissance des lexèmes dans l'analyse lexicale ?
  4. Quel type de grammaire, utilisé pour décrire la grammaire de nombreux langages de programmation, sert de base à l'analyse syntaxique ?
  5. Quelle est la forme correcte de l'arbre syntaxique abstrait de l'expression 2 + 3 * 4 ?

Comparatifs sur ce thème