Meilleure réponse
En supposant que vous vouliez sizeof (E), où E est un type enum:
Cela dépend sur le type sous-jacent. Normalement, cest int, mais si vous utilisez enum class
, vous pouvez le spécifier en C ++. Dans tous les cas, sizeof doit donner la bonne valeur.
Il ny a pas de méthode standard ou intégrée pour déterminer le nombre dénumérations en C ou C ++. Si vous êtes discipliné et navez pas de lacunes, vous pouvez utiliser quelque chose comme ceci: chaque énumération sauf le premier doit être supérieur de un à son prédécesseur:
enum Days { Monday, Tuesday, … Saturday, LAST };
Ici, le nombre de jours est le même que la valeur int de LAST, mais bien sûr, vous devez vous assurer que LAST est bien le dernier. Le compilateur ne peut pas appliquer cela.
Si vous ne commencez pas à zéro, mais pour une raison quelconque, commencez à disons 7, vous pouvez calculer LAST – Monday:
enum Days { Monday = 7, Tuesday, … Saturday, LAST };
int numDays = LAST - Monday; // still yields 7
Ici, assurez-vous également que Lundi reste le premier .
Réponse
Une énumération (abréviation de énumération ) est une technique pour ajouter une sorte de sens aux nombres. Les ordinateurs sont limités à travailler uniquement en nombres, et les énumérations permettent de prétendre que ces nombres décrivent une qualité plutôt quune quantité.
Lune des énumérations les plus connues est lencodage que nous utilisons pour stocker du texte. Lidée est dattribuer un numéro à chacune de nos lettres, de la même manière quun livre pour enfants écrira un code numérique. Le code que nous utilisons ressemble à ceci:
A = 65, B = 66, C = 67, … Z = 90; a = 97, b = 98, c = 99, … z = 122.
Si vous utilisez un ordinateur Windows, essayez ceci: Cliquez quelque part où vous pouvez taper du texte. Maintenez la touche ALT enfoncée et tout en maintenant la touche enfoncée, tapez lun de ces chiffres sur le pavé numérique. Par exemple, [Appuyez sur la touche Alt et maintenez-la enfoncée] 65 [Relâchez Alt]. La lettre A apparaîtra; cest une très ancienne méthode pour saisir des caractères directement en leur code numérique. Cest surtout utile pour taper des caractères internationaux lorsque vous navez pas le bon clavier installé: Çüéâäàåçê … sont ce que jobtiens avec Alt + 128, 129, 130, etc. Cest une façon dexposer lénumération sous-jacente des caractères.
Il ny a rien de magique à avoir choisi le nombre 65 pour signifier A; la seule chose qui compte, cest que nous soyons cohérents. Une énumération est donc une méthode pour attribuer des nombres à des idées non numériques et rendre le code un peu plus facile à utiliser.
Attention, cela est utile que lordre des caractères corresponde à lordre alphabétique (au moins en anglais). Cela facilite lécriture de tris de chaînes qui trient les choses par ordre alphabétique, car vous pouvez tricher et utiliser des comparaisons sur la valeur numérique. Cela devient un peu plus compliqué dans dautres langues, car les valeurs numériques attribuées aux caractères ne correspondent pas toujours à lordre alphabétique.
Pour un autre exemple dénumération, supposons que nous « écrivions un programme à traiter avec des connexions réseau. Les connexions réseau peuvent avoir différents états; elles peuvent être à lécoute , ouvertes , fermé , ou dans un état erreur . Ce sont des qualités, pas des quantités, et cest à cela que sert une énumération:
enum ConnectionState {
NCON\_LISTEN,
NCON\_OPEN,
NCON\_CLOSED,
NCON\_ERROR
};
À mon avis, il est généralement préférable dincorporer vos énumérations dans une définition de classe. Cela vous permet dignorer les préfixes:
class Connection {
public:
enum State {
LISTEN, OPEN, CLOSED, ERROR
};
};
Le type est Connection::State
et les valeurs sont Connection::LISTEN
, Connection::OPEN
, etc. Je pense que cest plus clair.
Votre exemple de mélange de valeurs numériques et de valeurs dénumération ne » t a du sens, toutes les valeurs énumérées doivent commencer par une lettre. Vous ne pouvez généralement pas utiliser un nombre là où une énumération est attendue; Les compilateurs C ++ traitent les entiers et les énumérations comme des types différents. Il n’est pas interdit d’associer des nombres significatifs aux valeurs d’énumération (notez à quel point cela est utile pour l’ordre alphabétique), mais ce n’est pas la pratique par défaut.
Pouvez-vous générer ou saisir une énumération? , mais comme il « sagit dun type personnalisé », vous devrez écrire vos propres opérateurs >> et