Hippopotame (./158) :
Pourquoi donc ?
ben parce que ce n'est pas le type qui est différent mais les fonctions.
et est-ce que le type d'un entier 32 bit et d'un float 32 bit est différent ? après tout il n'y a que les fonctions qui changent...
En effet, parce que "équivalentes au sens défini plus haut" ça veut dire qu'on peut remplacer l'un par l'autre et inversement ; là pphd parle d'un remplacement dans un seul sens, comme défini dans ./124 ^^ On remplace une expression "dangereuse" par une expression "inoffensive" qui garde le même sens sur son domaine de définition, donc ce n'est jamais un problème.
Ouais, on remplace une expression undefined par une expression qui a un sens.
Moi j'exige, quand j'écris 0/0, que le compilateur me fasse le café.
(enfin bon je vois bien la logique de la chose, mais ça parait fait tellement bizarrement)
ben justement, le contrat qu'est la norme C te dit qu'à partir du moment où tu écris 0/0 (enfin plus précisément à partir du moment où tu l'exécutes) tu n'as plus le droit de te plaindre... bref ton optimiseur de code source n'est jamais qu'un compilateur qui suit la norme C, et qui a donc le droit de faire absolument ce qu'il veut lorsqu'il tombe sur une undefined behaviour, y compris le transformer en une expression valide -- ça reste dans son contrat

sinon pour voir pourquoi la norme est conçue comme ça tu peux voir un programme comme une fonction partielle, définie sur les entrées où il n'y a pas d'undefined behaviour ; exiger qu'une transformation du programme donne exactement la même fonction partielle, c'est trop contraignant -- on peut très bien transformer en une fonction partielle identique mais avec un domaine de définition potentiellement plus grand... (de toute façon on n'a jamais accès au domaine de définition d'une fonction sauf avec un interpréteur fait pour, donc que le domaine de définition soit plus grand n'a aucune incidence en pratique)
cela dit ce n'est pas indispensable non plus pour permettre les optimisations : après tout en ajoutant la contrainte de garder le même domaine de définition je pourrais très bien optimiser "n+n-n" en "let _ = n+n in n" [*], mais le let est clairement superflu parce qu'on se tape du comportement du programme modifié là où l'original faisait n'importe quoi...
[*] : et ça serait pas forcément une optimisation idiote, dans la mesure où ça se parallélise mieux : le résultat final est disponible immédiatement, et le n+n peut être exécuté en parallèle ; alors qu'avec la version originale il faut tout calculer avant d'avoir accès au résultat final
