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=1
et z=2
sur les systèmes Linux et Windows?
typedef enum {
x,
y,
z
} someName;
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=1
et z=2
sur les systèmes Linux et Windows?
typedef enum {
x,
y,
z
} someName;
Réponses:
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.
[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."
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.
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».
'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
Oui, la valeur enum bydefult commence de 0 au nième élément vers n'importe quelle plateforme.