Hva er størrelsen på enum?


Beste svaret

Forutsatt at du vil ha størrelse på (E), hvor E er enumtype:

Det avhenger på den underliggende typen. Normalt er det int, men hvis du bruker enum class, kan du spesifisere dette i C ++. Uansett, sizeof skal gi riktig verdi.

Det er ingen standard eller innebygd måte å bestemme antall enumerands i C eller C ++. Hvis du er disiplinert og ikke har noen hull, kan du bruke noe slikt: hvert nummer og unntatt det første skal være ett høyere enn forgjengeren:

enum Days { Monday, Tuesday, … Saturday, LAST };

Her er antall dager det samme som int-verdien til SISTE, men selvfølgelig må du forsikre deg om at SISTE faktisk er sist. Kompilatoren kan ikke håndheve dette.

Hvis du ikke starter på null, men av en eller annen grunn begynner med si 7, kan du beregne SISTE – mandag:

enum Days { Monday = 7, Tuesday, … Saturday, LAST };

int numDays = LAST - Monday; // still yields 7

Her må du også sørge for at Mandag blir først .

Svar

Et nummer (forkortelse for oppregning ) er en teknikk for å legge til en slags mening til tall. Datamaskiner er begrenset til å jobbe bare i tall, og oppføringer lar oss late som om disse tallene beskriver en kvalitet, snarere enn en mengde.

En av de mest berømte oppregningene er kodingen vi bruker for å lagre tekst. Tanken er å tildele et nummer til hver av bokstavene våre, mye på den måten en bok for barn vil skrive en numerisk kode. Koden vi bruker ser omtrent slik ut:

A = 65, B = 66, C = 67, … Z = 90; a = 97, b = 98, c = 99, … z = 122.

Hvis du er på en Windows-maskin, kan du prøve dette: Klikk et sted hvor du kan skrive tekst. Hold nede ALT tasten, og mens du holder den nede, skriver du inn ett av disse tallene på talltastaturet. For eksempel [Trykk og hold inne Alt] 65 [Slipp Alt]. Bokstaven A vises. Dette er en veldig gammel metode for å skrive inn tegn direkte med deres numeriske kode. Det er mest nyttig for å skrive inn internasjonale tegn når du ikke har riktig tastatur installert: Çüéâäàåçê … er det jeg får fra Alt + 128, 129, 130 osv. Dette er en måte å avsløre den underliggende oppregningen av tegn.

Det er ikke noe magisk å ha valgt tallet 65 til å bety A; det eneste som betyr noe er at vi er konsistente. En oppregning er altså en metode for å tilordne tall til ikke-numeriske ideer, og gjøre koden litt lettere å jobbe med.

Husk at den er nyttig at rekkefølgen av tegn samsvarer med alfabetisk rekkefølge (i det minste på engelsk). Dette gjør det lettere å skrive strengesorter som sorterer ting i alfabetisk rekkefølge, fordi du kan jukse og bruke sammenligninger på den numeriske verdien. Det blir litt vanskeligere på andre språk, fordi de numeriske verdiene som er tildelt tegnene ikke alltid samsvarer med alfabetisk rekkefølge.

For et annet enumeksempel, la oss anta at vi skriver et program for å håndtere med nettverkstilkoblinger. Nettverkstilkoblinger kan ha noen forskjellige tilstander; de kan være lytter , åpen , lukket , eller i en feil -tilstand. Dette er kvaliteter, ikke mengder, og at «hva en enum er for:

enum ConnectionState {

NCON\_LISTEN,

NCON\_OPEN,

NCON\_CLOSED,

NCON\_ERROR

};

Etter min mening er det vanligvis bedre praksis å legge inn enumene dine i en klassedefinisjon. Dette lar deg hoppe over prefiksene:

class Connection {

public:

enum State {

LISTEN, OPEN, CLOSED, ERROR

};

};

Typen er Connection::State, og verdiene er Connection::LISTEN, Connection::OPEN osv. Jeg tror dette er tydeligere.

Ditt eksempel på å blande numeriske verdier og enumverdier gjør ikke det t er fornuftig, alle opptatte verdier må begynne med en bokstav. Du kan vanligvis ikke bruke et tall der det forventes et nummer; C ++ kompilatorer behandler mugg og enums som forskjellige typer. Det er ikke forbudt å ha meningsfulle tall knyttet til enumverdier (merk deg hvor nyttig det er for alfabetisk rekkefølge), men det er ikke standardpraksis.

Kan du sende ut eller legge inn et enum? Sikker på at du kan , men siden det er en tilpasset type, må du skrive dine egne >> og

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *