Si tengo un enum que no asigna números a las enumeraciones, será el valor ordinal de 0? Por ejemplo:

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

He sido capaz de encontrar un post citando que el estándar C99 requiere un 0 número ordinal. Pero sé C++ ignora muchas cosas en el estándar C99. Y también he sido capaz de encontrar un post presenciando el compilador utilizando un valor ordinal de 1, algo que también me parece recordar que veía, aunque no puedo decir cuánto tiempo hace que fue.

Realmente me gustaría ver una respuesta que confirma esta para C++, pero también me gustaría saber si un ordinal 0 tiene incluso si puedo especificar un valor en el medio de un enum:

enum enumeration { ZERO,
                   ONE,
                   TWO,
                   THREE = 13,
                   FOUR,
                   FIVE,
                   SIX,
                   SEVEN,
                   EIGHT,
                   NINE };
  • La siguiente enumeración constante siempre tendrá el valor de la anterior en la lista. Así que en su caso se obtendría 0, 1, 2, 13, 14, 15.... Tenga en cuenta que esto podría crear duplicados.
  • Mee sería muy extraño si los enumeradores en C++ opuesto a C no tiene que empezar de 0.:)
  • Estoy de acuerdo, y, obviamente, a partir de las respuestas que es el caso. Simplemente no pude encontrar nada de lo que ha garantizado para C++. Y no quiero mantener la especificación de una escala ordinal de 0 si no lo necesito :S
  • Estoy bastante seguro de que esta regla no ha cambiado en C99. Es decir, la forma en que fue desde C se inició.
InformationsquelleAutor Jonathan Mee | 2016-01-15

3 Comentarios

  1. 43

    Por ese estándar [de la dcl.enum]

    El tipo de enumeración declaró con una enumeración de clave de sólo enum es un ámbito de la enumeración, y su enumeradores son sin ámbito de los enumeradores. La enumeración-teclas de clase enum enum y estructura son semánticamente equivalentes; un tipo de enumeración declarado con uno de estos es un ámbito de la enumeración, y su enumeradores se encuentran en el ámbito
    los enumeradores. El opcional identificador no debe ser omitido en la declaración de un ámbito de la enumeración. El tipo de especificador-seq de una enumeración-base deberá nombre de un tipo integral; cualquier cv-calificación es ignorado. Un opaqueenum-declaración declarando un ámbito enumeración no omitir la enumeración de base. Los identificadores en un enumerador de la lista se declaran como constantes, y pueden aparecer donde las constantes son necesarios. Un enumeratordefinition con = da a los asociados enumerador el valor indicado por la expresión constante. Si el primer
    enumerador no tiene inicializador, el valor de la constante correspondiente es cero.
    Un enumerador-definición sin un inicializador da el enumerador el valor obtenido por el aumento del valor de la anterior enumerador por uno.

    el Énfasis es mío

    Así que sí, si no se especifica un valor de inicio se pondrá por defecto a 0.

    Realmente me gustaría ver una respuesta que confirma esta para C++, pero también me gustaría saber si un ordinal 0 se mantiene incluso si puedo especificar un valor en el medio de una enumeración:

    Esto también funciona. Comenzará a las 0 y de incremento a lo largo de la manera. Luego, después de la enumeración de asignar el valor a la misma comenzará a aumentar a partir de ese valor para las siguientes.

  2. 24

    De C++11 (especificación de 7.2/2):

    Si la primera enumerador no tiene inicializador, el valor de la constante correspondiente es cero. Un el enumerador de definición sin un inicializador da la enumerador el valor obtenido por el aumento del valor de la anterior enumerador por uno.

    Así que sí, el primer identificador en la enumeración tendrá el valor cero (si no es explícitamente inicializado a otro valor), y cada consecutivos identificador tendrá el valor de la anterior más uno.

Dejar respuesta

Please enter your comment!
Please enter your name here