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
Susan Sarandonoriginal
2024-11-16 06:50:03579parcourir

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;
}

É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!

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