Les valeurs d'énumération par défaut en C sont-elles les mêmes pour tous les compilateurs?

107

Lors de la déclaration d' un ENUM comme indiqué ci - dessous, ne tous les compilateurs C définissent les valeurs par défaut x=0, y=1et z=2sur les systèmes Linux et Windows?

typedef enum {
    x,
    y,
    z
} someName;
SSS
la source
3
Oui, c'est exigé par les normes, et je suis sûr que quelqu'un pourra les citer.
Nemo

Réponses:

115

Oui. Sauf indication contraire dans la définition de l'énumération, l'énumérateur initial a toujours la valeur zéro et la valeur de chaque énumérateur suivant est supérieure de un à l'énumérateur précédent.

James McNellis
la source
14
et, ce comportement identique est requis à la fois par C et C ++. En C ++, c'est [dcl.enum]: "Si le premier énumérateur n'a pas d'initialiseur, la valeur de la constante correspondante est zéro. Une définition d'énumérateur sans initialiseur donne à l'énumérateur la valeur obtenue en augmentant la valeur de l'énumérateur précédent de un."
Ben Voigt
3
Oui, ainsi que d'autres langages commençant par la lettre C, comme C #.
James McNellis
70

Norme C99

Le projet N1265 C99 indique au 6.7.2.2/3 "spécificateurs d'énumération"

Un énumérateur avec = définit sa constante d'énumération comme la valeur de l'expression constante. Si le premier énumérateur n'a pas =, la valeur de sa constante d'énumération est 0. Chaque énumérateur suivant avec no = définit sa constante d'énumération comme la valeur de l'expression constante obtenue en ajoutant 1 à la valeur de la constante d'énumération précédente. (L'utilisation d'énumérateurs avec = peut produire des constantes d'énumération avec des valeurs qui dupliquent d'autres valeurs dans la même énumération.)

Donc, ce qui suit est toujours valable pour les implémentations conformes:

principal 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;
}

Compilez et exécutez:

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

Testé sous Ubuntu 16.04, GCC 6.4.0.

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

Si la première valeur de la variable enum n'est pas initialisée, le compilateur C assigne automatiquement la valeur 0. Le compilateur continue d'augmenter la valeur de la variable enum précédente de 1.

Par exemple:

enum months{jan,feb,mar}

Explication: La valeur de jan sera 0, feb sera 1, mar sera 2.

enum months{jan=123,feb=999,mar}

Explication: La valeur de jan sera 123, fév sera 999, mar sera 1000.

enum months{jan='a',feb='s',mar}

Explication: La valeur de jan sera «a», feb sera «s», mar sera «t».

Vignesh vicky
la source
1
mar étant 't'n'est pas garanti, il peut y avoir des jeux de caractères dans lesquels les lettres ne sont pas dans l'ordre alphabétique consécutif
MM
-15

Oui, la valeur enum bydefult commence de 0 au nième élément vers n'importe quelle plateforme.

Devidas Gaikwad
la source
14
Pensez à la façon dont votre réponse ajoute à la réserve de réponses. Autrement dit, comment votre nouvelle réponse (5 ans plus tard) ajoute-t-elle quelque chose de nouveau qui n'est pas couvert dans une autre réponse? À première vue, cela semble moins instructif que les deux autres réponses.
LawfulEvil
2
Ehhh @LawfulEvil détendez-vous. Les réponses multiples donnent aux gens qui envisagent cela dans le futur de multiples perspectives. Cela dit, c'est une réponse mal formatée et non informative, mais de nombreuses réponses en elles-mêmes ne sont pas mauvaises.
Kenny Worden