I valori di enumerazione predefiniti in C sono gli stessi per tutti i compilatori?


107

Quando si dichiara un enum come mostrato di seguito, non tutti i compilatori C impostati i valori di default come x=0, y=1e z=2su entrambi i sistemi Linux e Windows?

typedef enum {
    x,
    y,
    z
} someName;

3
Sì, è richiesto dagli standard e sono certo che qualcuno potrà citarli.
Nemo

Risposte:


115

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.


14
e questo comportamento identico è richiesto sia da C che da C ++. In C ++, è [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."
Ben Voigt

3
Sì, e anche altri linguaggi che iniziano con la lettera C, come C #.
James McNellis

70

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.


7

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


1
essendo mar 't'non è garantito, possono esserci set di caratteri in cui le lettere non sono in ordine alfabetico consecutivo
MM

-15

Sì, enum value bydefult inizia da 0 a n ° elemento su qualsiasi piattaforma.


14
Considera come la tua risposta si aggiunge al pool di risposte. Cioè, come fa la tua nuova risposta (5 anni dopo) ad aggiungere qualcosa di nuovo che non è coperto da un'altra risposta? A prima vista, sembra essere meno informativo rispetto alle altre due risposte.
LawfulEvil

2
Ehhh @LawfulEvil relax. Le risposte multiple danno alle persone che guardano a questo in futuro prospettive multiple. Detto questo, questa è una risposta mal formattata e priva di informazioni, ma risposte ampie di per sé non sono male.
Kenny Worden
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.