C Language
uppräkningar
Sök…
Anmärkningar
Uppräkningar består av nyckelordet enum
och en valfri identifierare följt av en lista över listor som är bifogade av hängslen.
En identifierare är av typen int
.
Uppräknarlistan har minst ett tellerelement .
En teller kan valfritt "tilldelas" ett konstant uttryck av typ int
.
En teller är konstant och är kompatibel med antingen ett char
, ett signerat heltal eller ett osignerat heltal. Som någonsin används är implementeringsdefinerat . I vilket fall som helst bör den använda typen kunna representera alla värden som definierats för beräkningen i fråga.
Om ingen konstant uttryck "tilldelas" en uppräknaren och det är 1: a posten i en enumerator-lista tar det värde på 0
, annars får tar värdet av den tidigare post i uppräknaren listan plus ett.
Att använda flera "uppdrag" kan leda till att olika uppräknare av samma uppräkning har samma värden.
Enkel uppräkning
En uppräkning är en användardefinierad datatyp som består av integrerade konstanter och varje integralkonstant ges ett namn. Nyckelord enum
används för att definiera uppräknade datatyp.
Om du använder enum
istället för int
eller string/ char*
ökar du kompileringstidskontrollen och undviker att fel passerar i ogiltiga konstanter och du dokumenterar vilka värden som är lagliga att använda.
Exempel 1
enum color{ RED, GREEN, BLUE };
void printColor(enum color chosenColor)
{
const char *color_name = "Invalid color";
switch (chosenColor)
{
case RED:
color_name = "RED";
break;
case GREEN:
color_name = "GREEN";
break;
case BLUE:
color_name = "BLUE";
break;
}
printf("%s\n", color_name);
}
Med en huvudfunktion definierad enligt följande (till exempel):
int main(){
enum color chosenColor;
printf("Enter a number between 0 and 2");
scanf("%d", (int*)&chosenColor);
printColor(chosenColor);
return 0;
}
Exempel 2
(Det här exemplet använder designerade initialisatorer som är standardiserade sedan C99.)
enum week{ MON, TUE, WED, THU, FRI, SAT, SUN };
static const char* const dow[] = {
[MON] = "Mon", [TUE] = "Tue", [WED] = "Wed",
[THU] = "Thu", [FRI] = "Fri", [SAT] = "Sat", [SUN] = "Sun" };
void printDayOfWeek(enum week day)
{
printf("%s\n", dow[day]);
}
Samma exempel med intervallkontroll:
enum week{ DOW_INVALID = -1,
MON, TUE, WED, THU, FRI, SAT, SUN,
DOW_MAX };
static const char* const dow[] = {
[MON] = "Mon", [TUE] = "Tue", [WED] = "Wed",
[THU] = "Thu", [FRI] = "Fri", [SAT] = "Sat", [SUN] = "Sun" };
void printDayOfWeek(enum week day)
{
assert(day > DOW_INVALID && day < DOW_MAX);
printf("%s\n", dow[day]);
}
Typedef enum
Det finns flera möjligheter och konventioner för att namnge en uppräkning. Den första är att använda ett taggnamn strax efter enum
nyckelordet.
enum color
{
RED,
GREEN,
BLUE
};
Denna uppräkning måste då alltid användas med sökordet och taggen så här:
enum color chosenColor = RED;
Om vi använder typedef
direkt när vi deklarerar enum
, kan vi utelämna taggen och sedan använda typen utan enum
nyckelordet:
typedef enum
{
RED,
GREEN,
BLUE
} color;
color chosenColor = RED;
Men i det senare fallet kan vi inte använda det som enum color
, eftersom vi inte använde taggnamnet i definitionen. En vanlig konvention är att använda båda, så att samma namn kan användas med eller utan enum
nyckelord. Detta har den speciella fördelen att vara kompatibel med C ++
enum color /* as in the first example */
{
RED,
GREEN,
BLUE
};
typedef enum color color; /* also a typedef of same identifier */
color chosenColor = RED;
enum color defaultColor = BLUE;
Fungera:
void printColor()
{
if (chosenColor == RED)
{
printf("RED\n");
}
else if (chosenColor == GREEN)
{
printf("GREEN\n");
}
else if (chosenColor == BLUE)
{
printf("BLUE\n");
}
}
typedef
information om typedef
finns i Typedef
Uppräkning med duplicerat värde
Ett uppräkningsvärde behöver inte vara unikt:
#include <stdlib.h> /* for EXIT_SUCCESS */
#include <stdio.h> /* for printf() */
enum Dupes
{
Base, /* Takes 0 */
One, /* Takes Base + 1 */
Two, /* Takes One + 1 */
Negative = -1,
AnotherZero /* Takes Negative + 1 == 0, sigh */
};
int main(void)
{
printf("Base = %d\n", Base);
printf("One = %d\n", One);
printf("Two = %d\n", Two);
printf("Negative = %d\n", Negative);
printf("AnotherZero = %d\n", AnotherZero);
return EXIT_SUCCESS;
}
Exemplet skriver ut:
Base = 0
One = 1
Two = 2
Negative = -1
AnotherZero = 0
uppräkningskonstant utan typnamn
Uppräkningstyper kan också deklareras utan att ge dem ett namn:
enum { buffersize = 256, };
static unsigned char buffer [buffersize] = { 0 };
Detta gör det möjligt för oss att definiera kompileringstidskonstanter av typ int
som kan som i detta exempel användas som array-längd.