Initialisation des variables en C ++

Je crois savoir qu’une variable int sera initialisée automatiquement à 0 ; cependant, ce n’est pas le cas. Le code ci-dessous imprime une valeur aléatoire.

 int main () { int a[10]; int i; cout << i << endl; for(int i = 0; i < 10; i++) cout << a[i] << " "; return 0; } 
  • Quelles règles, le cas échéant, s’appliquent à l’initialisation?
  • Plus précisément, dans quelles conditions les variables sont-elles automatiquement initialisées?

Il sera automatiquement initialisé si

  • c’est une instance de classe / struct dans laquelle le constructeur par défaut initialise tous les types primitifs; comme l’ MyClass instance;
  • vous utilisez la syntaxe d’initialisation de tableau, par exemple int a[10] = {} (tout à zéro) ou int a[10] = {1,2}; (tous mis à zéro sauf les deux premiers éléments: a[0] == 1 et a[1] == 2 )
  • Même chose pour les classes / structures non agrégées, par exemple MyClass instance = {}; (plus d’informations à ce sujet peuvent être trouvées ici )
  • c’est une variable globale / externe
  • la variable est définie comme static (peu importe si elle est dans une fonction ou dans une scope globale / d’espace de noms) – merci Jerry

Ne faites jamais confiance à une variable de type simple (int, long, …) étant automatiquement initialisée! Cela peut arriver dans des langages comme C #, mais pas dans C & C ++.

int ne s’initialise pas à zéro. Quand vous dites int i; Tout ce que vous faites est de réserver de l’espace pour un entier. La valeur à cet emplacement n’est pas initialisée. C’est seulement fait avec vous dites int i = 0; (ou int i = 5; auquel cas la valeur est initialisée à 5). De toute façon, il est recommandé d’initialiser une variable à une valeur connue. Sinon, i conserve toute valeur aléatoire à cet emplacement de mémoire lorsque l’espace lui est réservé. C’est pourquoi le cout imprime une valeur aléatoire.

Les valeurs par défaut dépendent de l’implémentation du langage. Certaines langues l’initialiseront à une valeur “saine” (comme 0 peut-être). En règle générale, j’initialise toujours une variable à une valeur sensible (à moins que je sache que je vais l’initialiser sur autre chose avant de l’utiliser). Comme je l’ai déjà mentionné, il n’est pas judicieux de supposer que la valeur va être quelque chose de sain. Cela peut ou non être (selon la langue ou l’implémentation de l’interpréteur / compilateur pour cette langue).

Voir la section 4.9.5 Initialisation du langage de programmation C ++.

Selon que votre variable est locale, statique, définie par l’utilisateur ou const, l’initialisation peut se produire.

Comme vous utilisez POD (Plain Old Datatypes), la variable automatique n’est pas initialisée à une valeur par défaut.

Cet article le dit mieux: http://www.velocityreviews.com/forums/showpost.php?p=1528247&postcount=10

Il n’y a pas de constructeur “par défaut” pour les types non-classe, mais il y a une initialisation par défaut (zéro). Malheureusement, pour la compatibilité braindead avec C, l’initialisation par défaut n’est PAS effectuée pour les types de POD dans les circonstances suivantes:

Variables nues (c’est-à-dire déclarées sans initialiseurs) locales à une classe ou à une fonction.

instances dynamicment allouées.

Cependant, dans d’autres endroits (notamment les variables statiques) et dans le cas de tout paramètre donné, les parameters d’initialisation vides (lorsque cela est valide) obtiennent l’initialisation par défaut (zéro).

Pour forcer l’initialisation d’un POD (quel int est), vous pouvez utiliser la syntaxe de l’initialiseur de copie:

 #include  int main() { int i = int(); int j; std::cout << "i: " << i << std::endl; // warning: undefined behavior std::cout << "j: " << j << std::endl; } 

C'est sous "ne payez que pour ce que vous utilisez". Si vous souhaitez par la suite atsortingbuer une valeur à la variable ou si vous ne l’utilisez pas du tout, il n’ya aucune raison de procéder à l’initialisation. Pour l'obtenir, vous devez explicitement demander que ce travail soit fait.

En C ++, les variables automatiques sont indéfinies jusqu’à ce qu’elles reçoivent explicitement une valeur. Vous pensez peut-être à C # ou à d’autres langues .Net ou Java.

Différents systèmes d’exploitation (c.-à-d. OS X vs. Ubuntu Linux) réagiront différemment aux variables non initialisées par rapport aux variables initialisées en C ++. D’après mon expérience, la version OS X de gcc comstackra et imprimera 2 pour les deux versions du code ci-dessous. Comme si je travaillais sur une machine Linux Ubuntu, le premier bloc de code imprimera tout ce qui se trouve être à l’emplacement de la mémoire les références de la variable (+2 après la boucle).

  int c; for( int i = 0; i < 3; i++ ) { c++; } cout << c << endl; 

Où, ils vous donneront tous les mêmes résultats pour:

  int c = 0; for( int i = 0; i < 3; i++ ) { c++; } cout << c << endl; 

Les variables locales ne sont pas initialisées sauf si vous le faites vous-même. Ce que vous voyez, c’est que tous les déchets étaient sur la stack avant que votre méthode soit appelée.

Si aucun initialiseur n’est spécifié pour un object, l’object est initialisé par défaut. si aucune initialisation n’est effectuée, un object avec une durée de stockage automatique ou dynamic a une valeur indéterminée.

Par. 8.5, section 11 d’un brouillon récent C ++ 0x N3092.pdf,

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/

Bien que votre découverte récente puisse être importune (car vous devrez peut-être initialiser certaines variables sockets en charge par d’autres langages), cela peut signifier moins de cycles de processeur et donc un code plus rapide.

Ici int i; est une variable automatique qui doit être initialisée manuellement. la variable auto ne s’initialise pas automatiquement dans c et c ++.

Si vous souhaitez que le compilateur l’initialise, vous devez utiliser les éléments suivants,

déclarer i comme variable statique.

static int i; // zéro atsortingbuer au i par le compilateur.

déclare i comme variable globale [en dehors de main ()].