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?
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.
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);return0;}
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».
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.
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.
la source
[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"
Donc, ce qui suit est toujours valable pour les implémentations conformes:
principal c
Compilez et exécutez:
Testé sous Ubuntu 16.04, GCC 6.4.0.
la source
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:
Explication: La valeur de jan sera 0, feb sera 1, mar sera 2.
Explication: La valeur de jan sera 123, fév sera 999, mar sera 1000.
Explication: La valeur de jan sera «a», feb sera «s», mar sera «t».
la source
'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écutifOui, la valeur enum bydefult commence de 0 au nième élément vers n'importe quelle plateforme.
la source