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=1
y z=2
en ambos sistemas Linux y Windows?
typedef enum {
x,
y,
z
} someName;
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=1
y z=2
en ambos sistemas Linux y Windows?
typedef enum {
x,
y,
z
} someName;
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.
[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"
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.
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'.
't'
no está garantizado, puede haber conjuntos de caracteres en los que las letras no estén en orden alfabético consecutivo
Sí, el valor de enumeración por defecto comienza desde 0 hasta el elemento n en cualquier plataforma.