¿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?

typedef enum {
    x,
    y,
    z
} someName;

3
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.


14
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);
    return 0;
}

Compilar y ejecutar:

gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out

Probado en Ubuntu 16.04, GCC 6.4.0.


7

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'.


1
mar 't'no está garantizado, puede haber conjuntos de caracteres en los que las letras no estén en orden alfabético consecutivo
MM

-15

Sí, el valor de enumeración por defecto comienza desde 0 hasta el elemento n en cualquier plataforma.


14
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.
Kenny Worden
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.