web-dev-qa-db-fra.com

Initialisation variable en C ++

Ma compréhension est qu'une variable int sera initialisée à 0 automatiquement; 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;
}
  • Le cas échéant, quelles règles s'appliquent à l'initialisation?
  • Plus précisément, dans quelles conditions les variables sont-elles initialisées automatiquement?
41
skydoor

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 MyClass instance;
  • vous utilisez la syntaxe d'initialisation de tableau, par exemple int a[10] = {} (tous mis à 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)
  • il en va de même pour les classes/structures non agrégées, par ex. Instance MyClass = {}; (plus d'informations à ce sujet peuvent être trouvées ici )
  • c'est une variable globale/externe
  • la variable est définie static (peu importe si à l'intérieur d'une fonction ou dans la portée globale/namespace) - merci Jerry

Ne vous fiez jamais à une variable de type simple (int, long, ...) en cours d'initialisation automatique! Cela peut arriver dans des langages comme C #, mais pas en C & C++.

67
AndiDog

int ne s'initialise pas à zéro. Quand tu dis int i;, vous ne faites que réserver de l'espace pour un entier. La valeur à cet emplacement n'est pas initialisée. Cela ne se fait que si vous dites int i = 0; (ou int i = 5; auquel cas la valeur est initialisée à 5). Quoi qu'il en soit, il est recommandé d'initialiser une variable à une valeur connue. Sinon, i contient la valeur aléatoire qui se trouvait à cet emplacement mémoire lorsque de l'espace lui était réservé. C'est pourquoi le cout affiche 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 raisonnable (sauf si je sais que je vais l'initialiser à autre chose pour sûr avant de l'utiliser). Comme je l'ai mentionné précédemment, il n'est pas judicieux de supposer que la valeur va être quelque chose de sensé. Il peut ou non l'être (selon la langue ou l'implémentation de l'interpréteur/compilateur pour cette langue).

11
Vivin Paliath

See section 4.9.5 Initialisation du langage de programmation C++.

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

Étant donné que vous utilisez POD (Plain Old Datatypes), la variable automatique n'est initialisée à aucune valeur par défaut.

5
Nick Presta

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

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 POD dans les circonstances suivantes:

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

instances allouées dynamiquement.

Cependant, dans d'autres endroits (notamment les variables statiques) et dans le cas de quoi que ce soit étant donné les paramètres d'initialisation vides (lorsque cela est valide), obtient l'initialisation par défaut (zéro).

4
Will

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

#include <iostream>

int main() {
  int i = int();
  int j;

  std::cout << "i: " << i << std::endl;
  // warning: undefined behavior
  std::cout << "j: " << j << std::endl;
}

Il s'agit de "ne payer que ce que vous utilisez". Si vous allez par la suite attribuer une valeur à la variable, ou si vous ne l'utilisez pas du tout, il n'y a aucune raison de faire le travail d'initialisation. Pour l'obtenir, vous devez explicitement demander que ce travail soit fait.

4
Logan Capaldo

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

3
Jakob Borg

Différents systèmes d'exploitation (c'est-à-dire OS X contre 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 compilera et imprimera 2 pour les deux versions du code ci-dessous. Là où, comme si je travaillais sur une machine Ubuntu Linux, le premier bloc de code affichera tout ce qui se trouvait à l'emplacement mémoire des références de variable (+ 2 après la boucle).

    int c;

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

    cout << c << endl; 

Le cas échéant, ils vous donneront tous les mêmes résultats pour:

    int c = 0;

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

    cout << c << endl; 
3
t. fochtman

Les variables locales ne sont initialisées que si vous le faites vous-même. Ce que vous voyez, ce sont les ordures sur la pile avant l'appel de votre méthode.

2
Anon.

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

Par. 8.5, section 11 d'un récent projet de C++ 0x N3092.pdf,

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

2
eel ghEEz

Bien que votre découverte récente puisse ne pas être la bienvenue (car vous devrez peut-être initialiser certaines variables que d'autres langages auraient prises en charge), cela peut signifier moins de cycles de processeur, et donc un code plus rapide.

0
phlip