Bedste svar
Forudsat at du vil have størrelse på (E), hvor E er enumtype:
Det afhænger på den underliggende type. Normalt er det int, men hvis du bruger enum class
, kan du angive dette i C ++. Uanset hvad skulle sizeof give den rigtige værdi.
Der er ingen standard eller indbygget måde at bestemme antallet af enumerands i C eller C ++. Hvis du er disciplineret og ikke har nogen huller, kan du bruge noget som dette: hvert eneste antal undtagen det første skal være et højere end dets forgænger:
enum Days { Monday, Tuesday, … Saturday, LAST };
Her er antallet af dage det samme som int-værdien af LAST, men du skal selvfølgelig forsikre dig om, at LAST faktisk er sidste. Compileren kan ikke håndhæve dette.
Hvis du ikke starter ved nul, men af en eller anden grund starter ved sige 7, kan du beregne SIDST – mandag:
enum Days { Monday = 7, Tuesday, … Saturday, LAST };
int numDays = LAST - Monday; // still yields 7
Her skal du også sørge for at Mandag forbliver først .
Svar
Et enum (forkortelse for enumeration ) er en teknik til at tilføje en eller anden betydning til tal. Computere er begrænset til kun at arbejde i tal, og optællinger lader os foregive, at disse tal beskriver en kvalitet snarere end en mængde.
En af de mest berømte af optællinger er den kodning, vi bruger til lagring af tekst. Ideen er at tildele et nummer til hvert enkelt af vores bogstaver, meget på den måde, at en bog for børn vil skrive en numerisk kode. Koden, vi bruger, ser sådan ud:
A = 65, B = 66, C = 67, … Z = 90; a = 97, b = 98, c = 99, … z = 122.
Hvis du er på en Windows-maskine, skal du prøve dette: Klik et sted, hvor du kan skrive tekst. Hold ALT nede tast, og mens du holder den nede, skal du skrive et af disse tal på dit numeriske tastatur. F.eks. [Tryk og hold Alt] 65 [Slip Alt]. Bogstavet A vises. Dette er en rigtig gammel metode til at indtaste tegn direkte ved at deres numeriske kode. Det er mest nyttigt til at indtaste internationale tegn, når du ikke har det rigtige tastatur installeret: Çüéâäàåçê … er hvad jeg får fra Alt + 128, 129, 130 osv. Dette er en måde at eksponere på den underliggende optælling af tegn.
Der er ikke noget magisk ved at have valgt tallet 65 til at betyde A; det eneste der betyder noget er, at vi er konsistente. En optælling er derfor en metode til at tildele tal til ikke-numeriske ideer og gøre koden lidt lettere at arbejde med.
Husk, det er nyttigt, at rækkefølgen af tegn svarer til alfabetisk rækkefølge (i det mindste på engelsk). Dette gør det lettere at skrive strengesorter, der sorterer ting i alfabetisk rækkefølge, fordi du kan snyde og bruge sammenligninger på den numeriske værdi. Det bliver lidt vanskeligere på andre sprog, fordi de numeriske værdier, der er tildelt tegnene, ikke altid stemmer overens med alfabetisk rækkefølge.
For et andet eksempel på enum, lad os antage, at vi skriver et program til at håndtere med netværksforbindelser. Netværksforbindelser kan have et par forskellige tilstande; de kan være lytter , åben , lukket eller i en fejl tilstand. Disse er kvaliteter, ikke størrelser, og at “hvad en enum er til:
enum ConnectionState {
NCON\_LISTEN,
NCON\_OPEN,
NCON\_CLOSED,
NCON\_ERROR
};
Efter min mening er det normalt bedre praksis at integrere dine enums inde i en klassedefinition. Det giver dig mulighed for at springe præfikser over:
class Connection {
public:
enum State {
LISTEN, OPEN, CLOSED, ERROR
};
};
Typen er Connection::State
, og værdierne er Connection::LISTEN
, Connection::OPEN
osv. Jeg synes dette er klarere.
Dit eksempel på blanding af numeriske værdier og enumværdier gør ikke ” t giver mening, alle opregnede værdier skal starte med et bogstav. Du kan normalt ikke bruge et tal, hvor der forventes et antal; C ++ compilers behandler mellemrum og enums som forskellige typer. Det er ikke forbudt at have meningsfulde tal tilknyttet enumværdier (bemærk, hvor nyttigt det er i alfabetisk rækkefølge), men det er ikke standardpraksis.
Kan du output eller indtaste et enum? Sikker på at du kan , men da det er en brugerdefineret type, skal du skrive dine egne >> og