55 votes

Valeur par défaut de la variable Enum ?

La question est simple :

#include <iostream>

enum SomeEnum {  
    EValue1 = 1,  
    EValue2 = 4
};

int main() {
    SomeEnum enummy;
    std::cout << (int)enummy;
}

Quel sera le résultat ?

Remarque : Il s'agit no un entretien, il s'agit d'un code que j'ai hérité des développeurs précédents. L'opérateur de streaming ici est juste pour l'exemple, le code réel hérité ne l'a pas.

52voto

Armen Tsirunyan Points 59548

Le programme a Comportement indéfini . La valeur de enummy est indéterminée. Conceptuellement, il n'y a pas de différence entre votre code et le code suivant :

int main() {
   int i;          //indeterminate value
   std::cout << i; //undefined behavior
};

Si vous aviez défini votre variable au niveau de l'espace de nom, sa valeur serait initialisée à 0.

enum SomeEnum {  
    EValue1 = 1,  
    EValue2 = 4,  
};
SomeEnum e; // e is 0
int i;      // i is 0

int main()
{
    cout << e << " " << i; //prints 0 0 
}

Ne soyez pas surpris que e peut avoir des valeurs différentes de celles de l'un des éléments suivants SomeEnum Les valeurs de l'énumérateur de l'utilisateur. Chaque type d'énumération possède un type intégral sous-jacent (tel que int , short o long ) et l'ensemble des valeurs possibles d'un objet de ce type d'énumération est l'ensemble des valeurs que possède le type intégral sous-jacent. L'énumération est juste un moyen de nommer commodément certaines des valeurs et de créer un nouveau type, mais vous ne limitez pas les valeurs de votre énumération par l'ensemble des valeurs des énumérateurs.

Mise à jour : Quelques citations qui me soutiennent :

Zéro initialisation d'un objet de type T signifie :
- si T est un type scalaire (3.9), l'objet prend la valeur de 0 (zéro) converti en T ;

Notez que les énumérations sont des types scalaires.

Initialiser en valeur un objet de type T signifie :
- si T est un type de classe bla bla bla
- si T est une classe non syndiquée type bla bla
- si T est un type de tableau, alors bla bla bla - sinon, l'objet est zéro initialisé

Donc, nous entrons dans la partie autrement. Et les objets de l'espace de noms sont initialisés par des valeurs.

0voto

primeFactor Points 11

La sortie sera indéterminée. Les variables membres enummy ne peuvent être que 1 ou 4.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X