Bästa svaret
Förutsatt att du vill ha storlek på (E), där E är en enumtyp:
Det beror på på den underliggande typen. Normalt är det int, men om du använder enum class
kan du ange detta i C ++. Hur som helst, sizeof bör ge rätt värde.
Det finns inget standard- eller inbyggnads sätt att bestämma antalet enumerands i C eller C ++. Om du är disciplinerad och inte har några luckor kan du använda något så här: varje enumerand utom det första bör vara ett högre än föregångaren:
enum Days { Monday, Tuesday, … Saturday, LAST };
Här är antalet dagar samma som int-värdet för LAST, men naturligtvis måste du försäkra att LAST verkligen är sist. Kompilatorn kan inte genomdriva detta.
Om du inte börjar vid noll men av någon anledning börjar med säg 7 kan du beräkna SISTA – måndag:
enum Days { Monday = 7, Tuesday, … Saturday, LAST };
int numDays = LAST - Monday; // still yields 7
Se också till att Måndag stannar först .
Svar
Ett nummer (förkortning för uppräkning ) är en teknik för att lägga till någon form av mening till siffror. Datorer är begränsade till att bara arbeta i antal, och uppräkningar låter oss låtsas att dessa siffror beskriver en kvalitet snarare än en kvantitet.
En av de mest kända uppräkningarna är kodningen vi använder för att lagra text. Tanken är att tilldela ett nummer till var och en av våra bokstäver, mycket på det sättet att en bok för barn kommer att skriva en numerisk kod. Koden vi använder ser ungefär så här ut:
A = 65, B = 66, C = 67, … Z = 90; a = 97, b = 98, c = 99, … z = 122.
Om du är på en Windows-maskin, prova detta: Klicka någonstans där du kan skriva text. Håll ned ALT och håll den intryckt, skriv ett av dessa siffror på din numeriska knappsats. Till exempel [Håll Alt intryckt] 65 [Släpp Alt]. Bokstaven A kommer att visas. deras numeriska kod. Det är mest användbart för att skriva in internationella tecken när du inte har rätt tangentbord installerat: Çüéâäàåçê … är vad jag får från Alt + 128, 129, 130, etc. Detta är ett sätt att exponera den underliggande uppräkningen av tecken.
Det finns inget magiskt med att ha valt siffran 65 för att betyda A; det enda som är viktigt är att vi är konsekventa. En uppräkning är alltså en metod för att tilldela nummer till icke-numeriska idéer och göra koden lite lättare att arbeta med.
Kom ihåg att den är användbart att ordningen av tecken matchar alfabetisk ordning (åtminstone på engelska). Detta gör det lättare att skriva strängsorter som sorterar saker i alfabetisk ordning, eftersom du kan fuska och använda jämförelser på det numeriska värdet. Det blir lite svårare på andra språk, eftersom de numeriska värdena som tilldelas tecknen inte alltid matchar alfabetisk ordning.
För ett annat exempel på enum, låt oss anta att vi skriver ett program för att hantera med nätverksanslutningar. Nätverksanslutningar kan ha några olika tillstånd; de kan vara lyssnar , öppen , stängt , eller i ett -fel . Dessa är kvaliteter, inte kvantiteter, och att ”vad ett enum är för:
enum ConnectionState {
NCON\_LISTEN,
NCON\_OPEN,
NCON\_CLOSED,
NCON\_ERROR
};
Enligt min mening är det vanligtvis bättre praxis att bädda in dina enums i en klassdefinition. Du kan hoppa över prefixen:
class Connection {
public:
enum State {
LISTEN, OPEN, CLOSED, ERROR
};
};
Typen är Connection::State
, och värdena är Connection::LISTEN
, Connection::OPEN
osv. Jag tycker att detta är tydligare.
Ditt exempel på att blanda numeriska värden och enumvärden gör inte ” t meningsfullt, alla uppräknade värden måste börja med en bokstav. Du kan vanligtvis inte använda ett nummer där ett antal förväntas; C ++ kompilatorer behandlar ints och enums som olika typer. Det är inte förbjudet att ha meningsfulla siffror associerade med enumvärden (notera hur användbart det är för alfabetisk ordning), men det är inte standardmetoden.
Kan du mata ut eller mata in enum? Visst du kan , men eftersom det är en anpassad typ måste du skriva dina egna >> och