Maison > développement back-end > C++ > Le comportement « int x = x ; » est-il indéfini en C en raison de la conversion Lvalue en Rvalue ?

Le comportement « int x = x ; » est-il indéfini en C en raison de la conversion Lvalue en Rvalue ?

Barbara Streisand
Libérer: 2024-12-28 21:31:17
original
197 Les gens l'ont consulté

Is `int x = x;` Undefined Behavior in C   Due to Lvalue-to-Rvalue Conversion?

Initialisation et conversion lvalue en rvalue

L'extrait de code fourni soulève un problème couramment débattu en C . L'initialisation d'une variable avec elle-même, comme dans int x = x;, implique une conversion lvalue en rvalue. La question se pose de savoir si cette conversion conduit à un comportement indéfini (UB) étant donné que le « x » de droite est une valeur non initialisée et que la conversion lvalue en rvalue sur des valeurs non initialisées est généralement interdite.

Preuve de la conversion attendue de lvalue en rvalue

Bien que la norme C 11 ne dispose pas d'une spécification explicite concernant les catégories de valeurs attendues par le langage constructions, des preuves circonstancielles suggèrent que les rvalues ​​sont censées être l'attente par défaut.

  • Les opérateurs intégrés nécessitent systématiquement un opérande prvalue et mentionnent explicitement la conversion lvalue en rvalue si nécessaire.
  • L'initialisation des références implique qu'une conversion lvalue en rvalue est attendue pour l'objet initialisation.

Application à la conversion d'initialisation

Par analogie avec le comportement des opérateurs intégrés, il est raisonnable de supposer que l'initialisation par copie attend également un prvalue comme initialiseur. Cette hypothèse est en outre étayée par ce qui suit :

  • La norme met l'accent sur l'utilisation de conversions standard pour convertir l'expression d'initialisation en type de destination.
  • L'exécution d'une conversion lvalue en rvalue permet d'obtenir la valeur correcte. initialisation des variables avec les initialiseurs lvalue.
  • Le manque de conversions définies par l'utilisateur suggère que les conversions de catégorie de valeur sont destinées à être gérées par le Standard.

Implications pour l'extrait de code

En supposant que l'initialisation par copie attend une prvalue, l'extrait de code int x = x; conduirait en effet à l'UB. En effet, le « x » de droite est une lvalue non initialisée et sa conversion lvalue en rvalue donnerait une valeur indéterminée.

Preuves supplémentaires

Un rapport de défaut proposé souligne la nécessité de clarifier que la conversion lvalue en rvalue sur des objets avec une valeur indéterminée provoque une UB. Ce changement proposé soutient en outre l'idée selon laquelle l'initialisation par copie ne devrait pas permettre de telles conversions.

Conclusion

Sur la base des preuves disponibles, il est très probable que int x = X ; constitue UB en C , car la conversion lvalue en rvalue sur le 'x' non initialisé est interdite. Cependant, il est important de noter que la norme ne contient pas de spécifications définitives sur les catégories de valeurs attendues, ce qui laisse place à un débat en cours.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal