l'initialisation de l'enum tableau en c++
Je suis en train d'apprendre le c++, et faire un peu d'exercice à partir d'un livre en ce moment.
Je me suis demandé d'écrire une définition de l'enum qui prend 3 valeurs (avant, arrière, stop) et un ensemble de 15 éléments de ce type. Dans cette définition que j'ai pour définir les valeurs des 5 premiers éléments de ce tableau. Je l'ai fait sans problèmes, mais il m'a fait penser à.. Si j'écris:
enum move {FORWARD = 1, BACKWARD, STOP};
move array[15] {FORWARD, BACKWARD, STOP, STOP, STOP};
... 5 premiers éléments ont des valeurs de 1, 2, 3, 3, 3, mais après la qui sera de 0.
Comment est-il possible depuis le "mouvement" ne peut prendre que les valeurs 1, 2 ou 3?
Pourquoi le reste du tableau initialisé de toute façon si j'ai précisé juste 5 premiers champs?
Ou peut-être qu'il veut juste dire que ceux sont des champs vides?
Veuillez expliquer de manière simple afin de débutant comme moi peut comprendre :), merci.
- D'abord de ne pas utiliser de bouger comme un nom pour votre
enum
. - Il n'y a pas une telle chose comme champ vide ou vide de la zone de mémoire en C++. Trois est initialisé et non initialisée. Pour les pointeurs, il est aussi NUL (ou, de manière équivalente, nullptr).
- C'est ce que les espaces de noms sont pour la, droite? En essayant d'éviter chaque identificateur unique de la bibliothèque standard utilise est une perte de temps, sauf si il y a un risque réel de ce conflit, qui ne devrait plus se produire dans une bibliothèque, où vous exposer quelque chose de stupide utilisateur a l'aide de directives des deux bibliothèques.
- Les énumérations ne sont pas contrôlés par des valeurs valides. Il serait payer pour quelque chose que l'on ne l'utilisez pas.
- Voir ma réponse.
- je comprends maintenant. merci pour toutes les réponses.
Vous devez vous connecter pour publier un commentaire.
Chaque énumération est un type sous-jacent, et prend en charge une plage de valeurs. Le type sous-jacent est un type entier assez grand pour stocker l'ensemble de la gamme de valeurs. Tous les entiers dans cette gamme sont des valeurs valides (voir ci-dessous) pour un objet de type énumération, même si il n'y a aucun agent recenseur avec cette valeur.
0
est dans la plage de valeurs de l'énumération, d'où l'initialisation d'un objet de type énumération avec0
est fine.Valeurs entières peuvent être converties dans le type de l'énumération si ils sont dans la plage de valeurs que cette énumération prend en charge.
Si vous initialisez un agrégat (comme un tableau) avec des accolades
{..}
et de fournir moins d'initialiseurs qu'il y a des éléments dans l'ensemble, les éléments résultant sera valeur initialisée. Pour les types fondamentaux (commeint
) et l'énumération des types, ce qui signifie qu'ils vont être initialisé à partir de l'entier0
, convertis à leur type respectif.Selon la Norme C++ énumérations avec un non-fixe sous-jacente type ont un minimum de valeur égale à zéro si ils ont été définis de telle manière que leur agent recenseur avec un minimum de valeur n'est pas négatif.
Dans votre code, l'agent recenseur avec un minimum de valeur est
FORWARD
. Sa valeur n'est pas négatif. De sorte que le minimum de la valeur de l'énumération est 0.Prendre en compte que, selon le même C++ Stsandard
Comme pour le tableau car il y a moins d'initialiseurs qu'il y a d'éléments dans le tableau, alors tous les éléments qui n'ont pas un initialiseur sera initialisé à zéro. Et le zéro est la valeur valide pour l'énumération.
Votre
enum move
est créé explicitement avecFORWARD = 1, BACKWARD = 2, STOP = 3
.Lorsque vous essayez d'initialiser votre tableau, le reste de la valeur est égale à zéro parce que vous avez à leur donner une valeur explicite ou, sinon, la valeur par défaut est zéro, afin de remplir le tableau.
Il ne peut pas être "vide de la mémoire" dans un tableau et il ne peut pas être une partie initialisation de tableau soit.
En d'autres termes,
enum
valeurs sont une abstraction pourint
et, par conséquent, doit être initialisé comme des nombres entiers.