Pour comprendre pourquoi un comportement non défini peut Voyage dans le temps", comme le dit si bien @TartanLlama. Dans ce cas, examinons la règle "as-if" :
1.9 Exécution du programme
1 Les descriptions sémantiques de la présente Norme internationale définissent une machine abstraite non déterministe paramétrée. La présente Norme internationale internationale n'impose aucune exigence sur la structure des implémentations implémentations conformes. En particulier, elles n'ont pas besoin de copier ou d'émuler la structure de la machine abstraite. structure de la machine abstraite. Au contraire, les implémentations conformes conformes doivent émuler (uniquement) le comportement observable de la machine abstraite comme expliqué ci-dessous.
Ainsi, nous pouvons considérer le programme comme une "boîte noire" avec une entrée et une sortie. L'entrée peut être une entrée utilisateur, des fichiers, et bien d'autres choses. La sortie est le "comportement observable" mentionné dans la norme.
La norme ne définit qu'un mappage entre l'entrée et la sortie, rien d'autre. Pour ce faire, elle décrit un "exemple de boîte noire", mais indique explicitement que toute autre boîte noire présentant la même correspondance est également valable. Cela signifie que le contenu de la boîte noire n'est pas pertinent.
Dans cette optique, il serait absurde de dire qu'un comportement indéfini se produit à un moment donné. Dans le échantillon de la boîte noire, nous pourrions dire où et quand cela se produit, mais la réel La boîte noire pourrait être quelque chose de complètement différent, donc on ne peut plus dire où et quand ça se passe. En théorie, un compilateur pourrait par exemple décider d'énumérer toutes les entrées possibles et de pré-calculer les sorties résultantes. Le comportement indéfini se serait alors produit pendant la compilation.
Un comportement indéfini est l'inexistence d'une correspondance entre l'entrée et la sortie. Un programme peut avoir un comportement indéfini pour certaines entrées, mais un comportement défini pour d'autres. Dans ce cas, la correspondance entre l'entrée et la sortie est simplement incomplète ; il existe une entrée pour laquelle il n'y a pas de correspondance avec la sortie.
Le programme dans la question a un comportement indéfini pour toute entrée, donc la correspondance est vide.
7 votes
Je me demande si le compilateur pourrait comprendre que
a
n'est pas utilisé (sauf pour le calcul lui-même) et supprimez simplementa
12 votes
Vous pourriez apprécier Mon petit optimiseur : Le comportement indéfini est magique du CppCon cette année. Il s'agit de savoir quelles optimisations les compilateurs peuvent effectuer sur la base de comportements non définis.
2 votes
stackoverflow.com/questions/6664471/
3 votes
Voir aussi blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p=633
2 votes
"Un compilateur suffisamment avancé est indiscernable d'un adversaire."
1 votes
C'est presque un doublon : stackoverflow.com/questions/23153445/
0 votes
Cette question couvre les mêmes problèmes (en C)
0 votes
Un exemple courant de rejet de l'UB au moment de la compilation est le cas de l'appel d'une fonction déclarée mais non définie.
0 votes
Un comportement indéfini signifie qu'il est indéfini. Le compilateur est libre de faire n'importe quoi. Par exemple, il peut inverser sa compréhension de la norme et traiter chaque comportement défini comme non défini, et vice versa.
0 votes
@jcoder : Je crois que la réponse est fausse, mais c'est une idée fausse et courante. Jetez un œil à la mienne pour voir pourquoi.
0 votes
Bien sûr, l'UB n'est exposé que si int est plus petit que signed 32-bit...
0 votes
Si vous passez un pointeur nul dans un func qui ne peut pas recevoir un null eg memcpy, le compilateur peut supprimer toutes les vérifications de nullité sur ce pointeur N'IMPORTE OÙ, jusqu'à ce qu'il soit réassigné parce que vous lui avez dit qu'il ne peut pas être nul. La meilleure réponse à cette question est "N'utilisez pas UB partout" car le comportement peut être à la fois inattendu et aléatoire.
0 votes
Utiliser -fwrapv avec gcc et clang, d'ailleurs. Pas sûr que cela soit encore traité comme un comportement indéfini par la norme C. On est en 2016. Tous les appareils d'aujourd'hui utilisent l'arithmétique du complément à 2.
0 votes
J'ai ajouté un réponse qui couvre également C puisque personne ne l'a vraiment fait, il est étiqueté avec les deux.