Risposte:
Sì. A meno che non si specifichi diversamente nella definizione dell'enumerazione, l'enumeratore iniziale ha sempre il valore zero e il valore di ogni enumeratore successivo è uno maggiore dell'enumeratore precedente.
[dcl.enum]
: "Se il primo enumeratore non ha inizializzatore, il valore della costante corrispondente è zero. Una definizione di enumeratore senza inizializzatore fornisce all'enumeratore il valore ottenuto aumentando di uno il valore dell'enumeratore precedente."
Standard C99
La bozza N1265 C99 dice al 6.7.2.2/3 "Enumeration specifiers"
Un enumeratore con = definisce la sua costante di enumerazione come il valore dell'espressione costante. Se il primo enumeratore ha no
=
, il valore della sua costante di enumerazione è 0. Ogni enumeratore successivo con no = definisce la sua costante di enumerazione come il valore dell'espressione costante ottenuta aggiungendo 1 al valore della costante di enumerazione precedente. (L'uso di enumeratori con = può produrre costanti di enumerazione con valori che duplicano altri valori nella stessa enumerazione.)
Quindi quanto segue vale sempre per le implementazioni conformi:
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;
}
Compila ed esegui:
gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out
Testato in Ubuntu 16.04, GCC 6.4.0.
Se il primo valore della variabile enum non è inizializzato, il compilatore C assegna automaticamente il valore 0 Il compilatore continua ad aumentare il valore della variabile enum precedente di 1.
Per esempio:
enum months{jan,feb,mar}
Spiegazione: il valore di jan sarà 0, feb sarà 1, mar sarà 2.
enum months{jan=123,feb=999,mar}
Spiegazione: il valore di jan sarà 123, feb sarà 999, mar sarà 1000.
enum months{jan='a',feb='s',mar}
Spiegazione: Il valore di jan sarà "a", feb sarà "s", mar sarà "t".
't'
non è garantito, possono esserci set di caratteri in cui le lettere non sono in ordine alfabetico consecutivo
Sì, enum value bydefult inizia da 0 a n ° elemento su qualsiasi piattaforma.