web-dev-qa-db-fra.com

Est-ce que les énumérations C ++ commencent à 0?

Si j'ai un enum qui n'attribue pas de numéros aux énumérations, sa valeur ordinale sera-t-elle égale à 0? Par exemple:

enum enumeration { ZERO,
                   ONE,
                   TWO,
                   THREE,
                   FOUR,
                   FIVE,
                   SIX,
                   SEVEN,
                   EIGHT,
                   NINE };

J'ai été capable de trouver un post citant que la norme C99 nécessite un nombre ordinal . Mais je sais que C++ ignore plusieurs choses dans la norme C99. Et j’ai aussi pu trouver un après avoir observé le compilateur avec une valeur ordinale de 1 , quelque chose que je me souviens aussi d’avoir vu, bien que je ne puisse pas dire depuis combien de temps cela était.

J'aimerais vraiment voir une réponse qui confirme cela pour C++, mais j'aimerais aussi savoir si un ordinal 0 est vrai même si je spécifie un valeur au milieu d'un enum:

enum enumeration { ZERO,
                   ONE,
                   TWO,
                   THREE = 13,
                   FOUR,
                   FIVE,
                   SIX,
                   SEVEN,
                   EIGHT,
                   NINE };
43
Jonathan Mee

Selon cette norme [dcl.enum]

Le type d'énumération déclaré avec une enum-clé d'enum seulement est une énumération sans étendue et ses énumérateurs sont des énumérateurs. La classe enum-keys enum et la structure enum sont sémantiquement équivalentes; un type d'énumération déclaré avec l'un de ceux-ci est une énumération scoped, et ses énumérateurs sont des énumérateurs scoped. L'identificateur facultatif ne doit pas être omis dans la déclaration d'une énumération de portée. Le type-specifier-seq d'un enum-base doit nommer un type intégral; toute qualification cv est ignorée. Une déclaration opaqueenum déclarant une énumération non complétée ne doit pas omettre la énumération-base. Les identifiants dans une liste d'énumérateurs sont déclarés en tant que constantes et peuvent apparaître chaque fois que des constantes sont requises. Une énumération de définition avec = donne à l'énumérateur associé la valeur indiquée par l'expression constante. Si le premier énumérateur n'a pas d'initialiseur, la valeur de la constante correspondante est zéro. Une définition d'énumérateur sans initialiseur donne à l'énumérateur la valeur obtenue en augmentant la valeur du dernier énumérateur de un.

Le mien d'accent

Donc, oui, si vous ne spécifiez pas de valeur de départ, la valeur par défaut est 0.

J'aimerais vraiment voir une réponse qui confirme cela pour C++, mais j'aimerais aussi savoir si un ordinal 0 est valable même si je spécifie une valeur au milieu d'une énumération:

Cela fonctionne aussi. Il commencera à 0 et augmentera progressivement. Ensuite, après l’énumération, vous lui affectez la valeur qui commencera à augmenter à partir de cette valeur pour les suivantes.

44
NathanOliver

A partir de la spécification C++ 11 (7.2/2):

Si le premier énumérateur n'a pas initialiseur, la valeur de la constante correspondante est zéro. Un énumérateur-définition sans un initialiseur donne au énumérateur la valeur obtenue en augmentant la valeur du précédent énumérateur par une.

Donc oui, le premier identifiant de l'énumération aura la valeur zéro (s'il n'est pas explicitement initialisé à une autre valeur), et chaque identificateur consécutif aura la valeur du précédent plus un.

25

à partir de § 7.2, p 165

. Si le premier énumérateur n'a pas d'initialiseur, la valeur de la constante correspondante est zéro

source: http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4527.pdf

6
Richard Hodges