2016-01-15 35 views
15

Se ho un enum che non assegna numeri alle enumerazioni, il suo valore ordinale sarà 0? Per esempio:Le enumerazioni C++ iniziano da 0?

enum enumeration { ZERO, 
        ONE, 
        TWO, 
        THREE, 
        FOUR, 
        FIVE, 
        SIX, 
        SEVEN, 
        EIGHT, 
        NINE }; 

Sono stato in grado di trovare un post citing that the C99 standard requires a 0 ordinal number. Ma so che il C++ ignora molte cose nello standard C99. E sono anche riuscito a trovare uno post witnessing the compiler using an ordinal value of 1, qualcosa che mi sembra anche di ricordare, anche se non posso dire quanto tempo fa fosse.

mi piacerebbe davvero vedere una risposta che conferma questo per C++, ma mi piacerebbe anche sapere se un numero ordinale 0 vale anche se a specificare un valore nel bel mezzo di un enum:

enum enumeration { ZERO, 
        ONE, 
        TWO, 
        THREE = 13, 
        FOUR, 
        FIVE, 
        SIX, 
        SEVEN, 
        EIGHT, 
        NINE }; 
+2

La prossima costante di enumerazione avrà sempre il valore della precedente nell'elenco. Quindi nel tuo caso otterresti '0, 1, 2, 13, 14, 15 ...'. Si noti che questo potrebbe creare duplicati. – Lundin

+0

@Jonathan Mee Sarebbe molto strano se gli enumeratori in C++ opposti a C non inizino da 0. :) –

+0

@VladfromMoscow Sono d'accordo, e ovviamente dalle risposte è il caso. Non riuscivo a trovare nulla che lo garantisse per C++. E non voglio continuare a specificare un ordinale 0 se non è necessario: S –

risposta

17

Per quel tipo di serie [dcl.enum]

L'enumerazione dichiarato con un enum-chiave di un solo enum è un'enumerazione senza ambito, e le sue enumeratori sono enumeratori senza ambito. La classe enum enum-keys e enum struct sono semanticamente equivalenti; un tipo di enumerazione dichiarato con uno di questi è un'enumerazione con ambito e i suoi enumeratori sono enumeratori con ambito . L'identificatore facoltativo non deve essere omesso nella dichiarazione di un elenco di ambiti. Lo specificatore del tipo, seq, di una base di enumera deve indicare un tipo integrale; qualsiasi qualifica di cv è ignorata. Una dichiarazione di opaqueenum che dichiara un'enumerazione senza ambito non deve omettere l'enum-base. Gli identificatori in una lista di enumeratori sono dichiarati come costanti e possono apparire ovunque siano richieste le costanti. Una enumeratordefinition con = assegna all'enumeratore associato il valore indicato dalla costante-espressione. 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.

enfasi è mia

Quindi sì, se non si specifica un valore iniziale questo verrà impostato a 0.

mi piacerebbe davvero vedere una risposta che conferma questo per C++, ma mi piacerebbe anche sapere se un ordinale 0 vale anche se specificassi un valore nel mezzo di una enumerazione:

Anche questo funziona. Comincerà da 0 e aumenterà lungo la strada. Quindi, dopo che l'enum a cui assegni il valore, inizierà ad aumentare da quel valore per i successivi.

12

Dalla C++ 11 specifica (7.2/2):

Se il primo enumeratore ha inizializzatore, il valore della corrispondente costante è zero. Un enumeratore definizione senza inizializzatore concede le enumeratore il valore ottenuto aumentando il valore del precedente enumeratore di uno.

Quindi sì, il primo identificatore nell'enumerazione avrà il valore zero (se non è esplicitamente inizializzato a un altro valore), e ciascun identificatore consecutivo avrà il valore del precedente più uno.