Maison > développement back-end > C++ > Pourquoi le compilateur permet-il l'auto-initialisation des variables en C/C ?

Pourquoi le compilateur permet-il l'auto-initialisation des variables en C/C ?

Susan Sarandon
Libérer: 2024-11-16 06:50:03
original
582 Les gens l'ont consulté

Why does the compiler allow self-initialization of variables in C/C  ?

Variables non initialisées dans l'auto-initialisation : comportement et normes

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;
}
Copier après la connexion

É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.
Copier après la connexion

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!

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