¿Los valores de enumeración predeterminados en C son los mismos para todos los compiladores?
107
Cuando se declara una enumeración como se muestra a continuación, no todos los compiladores de C establecen los valores por defecto como x=0, y=1y z=2en ambos sistemas Linux y Windows?
Sí, es un requisito de los estándares y estoy seguro de que alguien podrá citarlos.
Nemo
Respuestas:
115
Si. A menos que especifique lo contrario en la definición de la enumeración, el enumerador inicial siempre tiene el valor cero y el valor de cada enumerador posterior es uno mayor que el enumerador anterior.
y, tanto C como C ++ requieren este comportamiento idéntico. En C ++, es [dcl.enum]: "Si el primer enumerador no tiene inicializador, el valor de la constante correspondiente es cero. Una definición de enumerador sin inicializador le da al enumerador el valor obtenido al aumentar el valor del enumerador anterior en uno".
Ben Voigt
3
Sí, y también otros lenguajes que comienzan con la letra C, como C #.
James McNellis
70
Estándar C99
El borrador N1265 C99 dice en 6.7.2.2/3 "Especificadores de enumeración"
Un enumerador con = define su constante de enumeración como el valor de la expresión constante. Si el primer enumerador tiene no =, el valor de su constante de enumeración es 0. Cada enumerador posterior con no = define su constante de enumeración como el valor de la expresión constante obtenida sumando 1 al valor de la constante de enumeración anterior. (El uso de enumeradores con = puede producir constantes de enumeración con valores que duplican otros valores en la misma enumeración).
Entonces, lo siguiente siempre se aplica a las implementaciones conformes:
C Principal
#include<assert.h>#include<limits.h>enum E {
E0,
E1,
E2 =3,
E3 =3,
E4,
E5 = INT_MAX,#if 0/* error: overflow in enumeration values */
E6,#endif};int main(void){/* If unspecified, the first is 0. */
assert(E0 ==0);
assert(E1 ==1);/* Repeated number, no problem. */
assert(E2 ==3);
assert(E3 ==3);/* Continue from the last one. */
assert(E4 ==4);
assert(E5 == INT_MAX);return0;}
Si el primer valor de la variable enum no se inicializa, el compilador de C asigna automáticamente el valor 0. El compilador sigue aumentando el valor de la variable enum anterior en 1.
P.ej:
enum months{jan,feb,mar}
Explicación: El valor de jan será 0, feb será 1, mar será 2.
enum months{jan=123,feb=999,mar}
Explicación: El valor de jan será 123, feb será 999, mar será 1000.
enum months{jan='a',feb='s',mar}
Explicación: El valor de jan será 'a', feb será 's', mar será 't'.
Considere cómo su respuesta se suma al conjunto de respuestas. Es decir, ¿cómo agrega su nueva respuesta (5 años después) algo nuevo que no está cubierto en otra respuesta? A primera vista, parece ser menos informativo que las otras dos respuestas.
LawfulEvil
2
Ehhh @LawfulEvil relájate. Varias respuestas dan a las personas que miran esto en el futuro múltiples perspectivas. Dicho esto, esta es una respuesta poco informativa y con formato deficiente, pero las respuestas amplias en sí mismas no son malas.
Respuestas:
Si. A menos que especifique lo contrario en la definición de la enumeración, el enumerador inicial siempre tiene el valor cero y el valor de cada enumerador posterior es uno mayor que el enumerador anterior.
fuente
[dcl.enum]
: "Si el primer enumerador no tiene inicializador, el valor de la constante correspondiente es cero. Una definición de enumerador sin inicializador le da al enumerador el valor obtenido al aumentar el valor del enumerador anterior en uno".Estándar C99
El borrador N1265 C99 dice en 6.7.2.2/3 "Especificadores de enumeración"
Entonces, lo siguiente siempre se aplica a las implementaciones conformes:
C Principal
Compilar y ejecutar:
Probado en Ubuntu 16.04, GCC 6.4.0.
fuente
Si el primer valor de la variable enum no se inicializa, el compilador de C asigna automáticamente el valor 0. El compilador sigue aumentando el valor de la variable enum anterior en 1.
P.ej:
Explicación: El valor de jan será 0, feb será 1, mar será 2.
Explicación: El valor de jan será 123, feb será 999, mar será 1000.
Explicación: El valor de jan será 'a', feb será 's', mar será 't'.
fuente
't'
no está garantizado, puede haber conjuntos de caracteres en los que las letras no estén en orden alfabético consecutivoSí, el valor de enumeración por defecto comienza desde 0 hasta el elemento n en cualquier plataforma.
fuente