Maison  >  Article  >  développement back-end  >  Pourquoi `int i = i;` se compile-t-il avec un comportement non défini ?

Pourquoi `int i = i;` se compile-t-il avec un comportement non défini ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-11 07:21:03630parcourir

Why Does `int i = i;` Compile with Undefined Behavior?

Comportement d'une variable non initialisée utilisée comme son propre initialiseur

Ce code en C/C soulève des questions sur son comportement :

int i = i;

Malgré la présence d'une variable non initialisée, ce code se compile sans avertissements ni erreurs. Pourquoi cela se produit-il et que dit la norme sur son comportement ?

Valeur indéterminée et dépendance d'implémentation

Lorsqu'une variable comme i est utilisée pour s'initialiser, elle contient une valeur indéterminée. Cette valeur peut être une valeur non spécifiée ou une représentation d'interruption. Une valeur non spécifiée n'est pas définie par la norme et dépend de l'implémentation. Une représentation de piège, si elle est prise en charge par l'implémentation, déclenche un comportement non défini lorsqu'elle est utilisée.

Comportement non défini avec remplissage

Si l'implémentation alloue des bits de remplissage dans des types entiers, et si la valeur indéterminée est une représentation piège, son utilisation entraîne alors un comportement indéfini. En effet, l'accès à la représentation du piège entraîne des résultats inattendus.

Valeur non spécifiée sans remplissage

Cependant, si l'implémentation n'alloue pas de bits de remplissage en nombres entiers, la valeur indéterminée est simplement non précisé. Dans ce cas, il n'y a pas de comportement indéfini et la valeur exacte de i est déterminée par l'implémentation.

Comportement non défini avec adresse prise

De plus, le comportement peut devenir indéfini même si i n'a pas son adresse prise, comme indiqué dans la norme C11 :

"Si la lvalue désigne un objet de durée de stockage automatique qui aurait pu être déclaré avec la classe de stockage du registre (son adresse n'a jamais été prise) et que cet objet n'est pas initialisé, le comportement n'est pas défini."

Par conséquent, le comportement de ce code dépend de l'implémentation et peut être indéfini en fonction de divers facteurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn