c++ - name - use enum
¿Los enums de C++ comienzan en 0? (3)
Si tengo una enum
que no asigna números a las enumeraciones, ¿será su valor ordinal 0? Por ejemplo:
enum enumeration { ZERO,
ONE,
TWO,
THREE,
FOUR,
FIVE,
SIX,
SEVEN,
EIGHT,
NINE };
He podido encontrar un post citando que el estándar C99 requiere un número ordinal de 0 . Pero sé que C ++ ignora varias cosas en el estándar C99. Y también he podido encontrar una publicación que presencia el compilador utilizando un valor ordinal de 1 , algo que también recuerdo haber visto, aunque no puedo decir cuánto tiempo hace que fue eso.
Realmente me gustaría ver una respuesta que confirme esto para C ++, pero también me gustaría saber si un 0 ordinal se mantiene incluso si especifico un valor en medio de una enum
:
enum enumeration { ZERO,
ONE,
TWO,
THREE = 13,
FOUR,
FIVE,
SIX,
SEVEN,
EIGHT,
NINE };
De la especificación C ++ 11 (7.2 / 2):
Si el primer enumerador no tiene inicializador , el valor de la constante correspondiente es cero. Una definición de enumerador sin un inicializador le da al enumerador el valor obtenido al aumentar el valor del enumerador anterior en uno.
Entonces, sí, el primer identificador en la enumeración tendrá el valor cero (si no se inicializa explícitamente a otro valor), y cada identificador consecutivo tendrá el valor del más anterior.
Por ese estándar [dcl.enum]
El tipo de enumeración declarado con una clave de enumeración de solo enum es una enumeración sin ámbito, y sus enumeradores son enumeradores sin ámbito. La enum-keys enum class y enum struct son semánticamente equivalentes; un tipo de enumeración declarado con uno de estos es una enumeración de ámbito, y sus enumeradores son enumeradores de ámbito. El identificador opcional no se omitirá en la declaración de una enumeración de ámbito. El tipo-especificador-seq de una enum-base debe nombrar un tipo integral; Se ignora cualquier cualificación cv. Una declaración de opaqueenum que declara una enumeración sin ámbito no deberá omitir la enum-base. Los identificadores en una lista de enumeradores se declaran como constantes y pueden aparecer donde se requieran constantes. Una definición de enumerador con = le da al enumerador asociado el valor indicado por la expresión constante. Si el primer enumerador no tiene inicializador, el valor de la constante correspondiente es cero. Una definición de enumerador sin un inicializador le da al enumerador el valor obtenido al aumentar el valor del enumerador anterior en uno.
Énfasis mio
Así que sí, si no especifica un valor de inicio, por defecto será 0.
Realmente me gustaría ver una respuesta que confirme esto para C ++, pero también me gustaría saber si un 0 ordinal se mantiene incluso si especifico un valor en medio de una enumeración:
Esto también funciona. Comenzará en 0 y aumentará a lo largo del camino. Luego, después de que la enumeración le asigne el valor, comenzará a aumentar a partir de ese valor para los siguientes.
del § 7.2, p. 165
. Si el primer enumerador no tiene inicializador, el valor de la constante correspondiente es cero
fuente: http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4527.pdf