Os valores enum padrão em C são os mesmos para todos os compiladores?

107

Ao declarar um enum como mostrado abaixo, todos os compiladores C definem os valores padrão como x=0 , y=1e z=2em ambos os sistemas Linux e Windows?

typedef enum {
    x,
    y,
    z
} someName;
SSS
fonte
3
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.

James McNellis
fonte
14
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 #.
James McNellis
70

C99 Standard

O rascunho do N1265 C99 diz em 6.7.2.2/3 "especificadores de enumeração"

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

Compile e execute:

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

Testado no Ubuntu 16.04, GCC 6.4.0.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fonte
7

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

Vignesh vicky
fonte
1
ser mar 't'não é garantido, pode haver conjuntos de caracteres nos quais as letras não estão em ordem alfabética consecutiva
MM
-15

Sim, o valor enum bydefult começa de 0 ao n'ésimo elemento para qualquer plataforma.

Devidas Gaikwad
fonte
14
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.
Kenny Worden