Beste antwoord
Ervan uitgaande dat u sizeof (E) wilt, waarbij E een enum-type is:
Het hangt ervan af op het onderliggende type. Normaal gesproken is dat int, maar als je enum class
gebruikt, kun je dit specificeren in C ++. Hoe dan ook, sizeof zou de juiste waarde moeten geven.
Er is geen standaard of ingebouwde manier om het aantal enumerands in C te bepalen of C ++. Als je gedisciplineerd bent en geen hiaten hebt, kun je zoiets als dit gebruiken: elke opsomming, behalve de eerste, moet er een hoger zijn dan zijn voorganger:
enum Days { Monday, Tuesday, … Saturday, LAST };
Hier is het aantal dagen hetzelfde als de int-waarde van LAST, maar je moet er natuurlijk voor zorgen dat LAST inderdaad de laatste is. De compiler kan dit niet afdwingen.
Als je niet bij nul begint, maar om de een of andere reden bijvoorbeeld bij 7 begint, zou je LAST – Monday kunnen berekenen:
enum Days { Monday = 7, Tuesday, … Saturday, LAST };
int numDays = LAST - Monday; // still yields 7
Zorg er hier ook voor dat Maandag blijft eerst .
Antwoord
Een enum (afkorting van enumeration ) is een techniek om een soort betekenis aan getallen toe te voegen. Computers zijn beperkt tot het werken met alleen cijfers, en opsommingen laten ons doen alsof die cijfers een kwaliteit beschrijven in plaats van een kwantiteit.
Een van de bekendste opsommingen is de codering die we gebruiken voor het opslaan van tekst. Het idee is om aan elk van onze letters een nummer toe te kennen, net zoals een boek voor kinderen een cijfercode zal schrijven. De code die we gebruiken ziet er ongeveer zo uit:
A = 65, B = 66, C = 67, … Z = 90; a = 97, b = 98, c = 99, … z = 122.
Als u op een Windows-machine werkt, probeer dan dit: Klik ergens waar u tekst kunt typen. Houd de ALT -toets, en terwijl u deze ingedrukt houdt, typt u een van deze cijfers op uw numeriek toetsenblok. Bijvoorbeeld [Houd Alt ingedrukt] 65 [Laat Alt los]. De letter A verschijnt; dit is een heel oude methode om tekens rechtstreeks in te typen door hun numerieke code. Het is vooral handig voor het typen van internationale tekens als je niet het juiste toetsenbord hebt geïnstalleerd: Çüéâäàåçê … is wat ik krijg van Alt + 128, 129, 130, etc. Dit is een manier om de onderliggende opsomming van karakters.
Er is niets magisch aan het kiezen van het getal 65 om A te betekenen; het enige dat telt, is dat we consistent zijn. Een opsomming is dus een methode om getallen toe te wijzen aan niet-numerieke ideeën, en om de code een beetje gemakkelijker te maken om mee te werken.
Let wel, het is is handig dat de volgorde van tekens overeenkomt met de alfabetische volgorde (in het Engels tenminste). Dit maakt het gemakkelijker om tekenreekssorteringen te schrijven die dingen in alfabetische volgorde sorteren, omdat je vals kunt spelen en vergelijkingen kunt maken met de numerieke waarde. Het wordt een beetje lastiger in andere talen, omdat de numerieke waarden die aan de karakters zijn toegewezen niet altijd overeenkomen met de alfabetische volgorde.
Laten we voor een ander opsommingsvoorbeeld veronderstellen dat we een programma schrijven om met netwerkverbindingen. Netwerkverbindingen kunnen een paar verschillende statussen hebben; ze kunnen luisteren zijn, open , gesloten , of in een fout staat. Dit zijn kwaliteiten, geen hoeveelheden, en dat is waar een enum voor is:
enum ConnectionState {
NCON\_LISTEN,
NCON\_OPEN,
NCON\_CLOSED,
NCON\_ERROR
};
Naar mijn mening is het gewoonlijk beter om uw enums in een klassendefinitie in te sluiten. Hiermee kunt u de voorvoegsels overslaan:
class Connection {
public:
enum State {
LISTEN, OPEN, CLOSED, ERROR
};
};
Het type is Connection::State
, en de waarden zijn Connection::LISTEN
, Connection::OPEN
, etc. Ik denk dat dit duidelijker is.
Uw voorbeeld van het combineren van numerieke waarden en opsommingswaarden niet ” t is logisch: alle opgesomde waarden moeten beginnen met een letter. Meestal kun je “geen nummer gebruiken als een opsomming wordt verwacht; C ++ – compilers behandelen ints en enums als verschillende typen. Het is niet verboden om betekenisvolle getallen te koppelen aan opsommingswaarden (merk op hoe handig het is voor alfabetische volgorde), maar het is niet de standaardpraktijk.
Kun je een enum uitvoeren of invoeren? Natuurlijk wel , maar aangezien het een aangepast type is, moet u uw eigen >> en