Sim, é exigido pelos padrões e tenho certeza de que alguém poderá citá-los.
Nemo
Respostas:
115
Sim. A menos que você especifique o contrário na definição da enumeração, o enumerador inicial sempre tem o valor zero e o valor de cada enumerador subsequente é um maior que o enumerador anterior.
e esse comportamento idêntico é exigido por C e C ++. Em C ++, é [dcl.enum]: "Se o primeiro enumerador não tiver inicializador, o valor da constante correspondente é zero. Uma definição de enumerador sem um inicializador dá ao enumerador o valor obtido aumentando o valor do enumerador anterior em um."
Ben Voigt
3
Sim, e também outras linguagens que começam com a letra C, como C #.
Um enumerador com = define sua constante de enumeração como o valor da expressão constante. Se o primeiro enumerador tiver no =, o valor de sua constante de enumeração é 0. Cada enumerador subsequente com no = define sua constante de enumeração como o valor da expressão constante obtida adicionando 1 ao valor da constante de enumeração anterior. (O uso de enumeradores com = pode produzir constantes de enumeração com valores que duplicam outros valores na mesma enumeração.)
Portanto, o seguinte sempre se aplica às implementações em conformidade:
main.c
#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;}
Se o primeiro valor da variável enum não for inicializado, o compilador C atribui automaticamente o valor 0. O compilador continua aumentando o valor da variável enum anterior em 1.
Por exemplo:
enum months{jan,feb,mar}
Explicação: O valor de jan será 0, feb será 1, mar será 2.
enum months{jan=123,feb=999,mar}
Explicação: O valor de jan será 123, fev será 999, mar será 1000.
enum months{jan='a',feb='s',mar}
Explicação: O valor de jan será 'a', feb será 's', mar será 't'.
Considere como sua resposta aumenta o conjunto de respostas. Ou seja, como sua nova resposta (5 anos depois) adiciona algo novo que não foi abordado em outra resposta? À primeira vista, parece menos informativo do que as outras duas respostas.
LawfulEvil
2
Ehhh @LawfulEvil relaxe. Múltiplas respostas dão às pessoas que olham para isso no futuro múltiplas perspectivas. Dito isso, esta é uma resposta mal formatada e pouco informativa, mas respostas amplas em si mesmas não são ruins.
Respostas:
Sim. A menos que você especifique o contrário na definição da enumeração, o enumerador inicial sempre tem o valor zero e o valor de cada enumerador subsequente é um maior que o enumerador anterior.
fonte
[dcl.enum]
: "Se o primeiro enumerador não tiver inicializador, o valor da constante correspondente é zero. Uma definição de enumerador sem um inicializador dá ao enumerador o valor obtido aumentando o valor do enumerador anterior em um."C99 Standard
O rascunho do N1265 C99 diz em 6.7.2.2/3 "especificadores de enumeração"
Portanto, o seguinte sempre se aplica às implementações em conformidade:
main.c
Compile e execute:
Testado no Ubuntu 16.04, GCC 6.4.0.
fonte
Se o primeiro valor da variável enum não for inicializado, o compilador C atribui automaticamente o valor 0. O compilador continua aumentando o valor da variável enum anterior em 1.
Por exemplo:
Explicação: O valor de jan será 0, feb será 1, mar será 2.
Explicação: O valor de jan será 123, fev será 999, mar será 1000.
Explicação: O valor de jan será 'a', feb será 's', mar será 't'.
fonte
't'
não é garantido, pode haver conjuntos de caracteres nos quais as letras não estão em ordem alfabética consecutivaSim, o valor enum bydefult começa de 0 ao n'ésimo elemento para qualquer plataforma.
fonte