Maison >développement back-end >C++ >Pourquoi le compilateur permet-il l'auto-initialisation des variables en C/C ?
Dans le domaine de la programmation, il est souvent préoccupant d'utiliser des variables non initialisées. Dans le cas où une variable non initialisée est utilisée comme son propre initialiseur, un scénario unique se présente.
Considérez le code suivant :
int main(void) { int i = i; }
Étonnamment, ce code est Il peut être compilé avec clang/gcc /clang /g en utilisant des standards tels que 11. De plus, le compilateur n'émet aucun avertissement lorsque vous spécifiez l'option -Wall -Wextra.
Cependant, si vous modifiez votre code en int i = i 1 et spécifiez l'option -Wall, vous pouvez recevoir un avertissement similaire au suivant :
why.c:2:13: warning: variable 'i' is uninitialized when used within its own initialization [-Wuninitialized] int i = i + 1; ~ ^ 1 warning generated.
Alors pourquoi le compilateur autorise-t-il ce code ? De plus, comment la norme C/C précise-t-elle cela ?
Tolérance du compilateur
La variable i n'est pas initialisée lorsqu'elle s'auto-initialise, elle a donc une valeur non spécifique à ce stade. Une valeur non spécifique est soit une valeur non spécifiée, soit une expression piège.
Si une implémentation prend en charge les bits de bourrage pour les types entiers et que les valeurs non spécifiques sont des expressions pièges, son utilisation entraînera un comportement non défini.
Si l'implémentation n'a pas le bit de remplissage entier, la valeur est simplement non spécifiée et aucun comportement non défini ne se produit.
Dispositions standards
Section 6.3.2.1p2 des détails de la norme C11 :
lvalue représente un objet avec une durée de stockage automatique, l'objet aurait pu être déclaré avec la classe de stockage du registre (l'adresse n'a jamais été prise), et l'objet n'a pas été initialisé (S'il n'est pas déclaré dans un initialiseur et qu'aucun l'affectation est effectuée avant utilisation), son comportement n'est pas défini.
Donc, si vous n'avez jamais obtenu l'adresse de i, vous obtiendrez un comportement indéfini. Sinon, la déclaration ci-dessus s'applique.
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!