Lorsque vous déclarez une énumération comme indiqué ci-dessous, tous les compilateurs C définissent-ils les valeurs par défaut comme x=0
, y=1
, et z=2
sur les systèmes Linux et Windows?
typedef enum {
x,
y,
z
} someName;
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 1% à celle de l'énumérateur précédent.
C99 Standard
Le brouillon N1265 C99 dit au 6.7.2.2/3 "Spécificateurs d'énumération"
Un énumérateur avec = définit sa constante d'énumération en tant que 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 l'énumération précédente. constant. (L'utilisation d'énumérateurs avec = peut produire des constantes d'énumération avec des valeurs qui dupliquent d'autres valeurs de 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;
}
Compiler et exécuter:
gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out
Testé sous Ubuntu 16.04, GCC 6.4.0.
Si la première valeur de la variable enum n'est pas initialisée, le compilateur C attribue automatiquement la valeur 0. Le compilateur continue à 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 de 123, feb sera de 999, mars sera de 1000.
enum months{jan='a',feb='s',mar}
Explication: La valeur de jan sera "a", fév sera "s", mar sera "t".