C Language
opsommingen
Zoeken…
Opmerkingen
Opsommingen bestaan uit het enum
trefwoord en een optionele identificatie gevolgd door een opsommingslijst tussen accolades.
Een ID is van het type int
.
De tellerlijst heeft ten minste één tellerelement .
Een teller kan optioneel een constante uitdrukking van het type int
worden "toegewezen".
Een teller is constant en compatibel met een char
, een geheel getal of een geheel getal zonder teken. Welke ooit wordt gebruikt, is implementatie-gedefinieerd . In elk geval moet het gebruikte type in staat zijn om alle waarden weer te geven die voor de betreffende opsomming zijn gedefinieerd.
Als er geen constante uitdrukking is "toegewezen" om een teller en het is de 1 ste vermelding in een enumerator-list duurt waarde van 0
, anders krijgen neemt de waarde van de vorige vermelding in de enumerator-lijst plus 1.
Het gebruik van meerdere "toewijzingen" kan ertoe leiden dat verschillende enumerators van dezelfde opsomming dezelfde waarden hebben.
Eenvoudige opsomming
Een opsomming is een door de gebruiker gedefinieerd gegevenstype dat uit integrale constanten bestaat en elke integrale constante een naam krijgt. Trefwoord enum
wordt gebruikt om opgesomd gegevenstype te definiëren.
Als u enum
plaats van int
of string/ char*
, verhoogt u de compilatietijd en voorkomt u fouten door ongeldige constanten door te geven en documenteert u welke waarden legaal zijn.
voorbeeld 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);
}
Met een hoofdfunctie die als volgt is gedefinieerd (bijvoorbeeld):
int main(){
enum color chosenColor;
printf("Enter a number between 0 and 2");
scanf("%d", (int*)&chosenColor);
printColor(chosenColor);
return 0;
}
Voorbeeld 2
(In dit voorbeeld worden aangewezen initializers gebruikt die sinds C99 zijn gestandaardiseerd.)
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]);
}
Hetzelfde voorbeeld met bereikcontrole:
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
Er zijn verschillende mogelijkheden en conventies om een opsomming te noemen. De eerste is om een tagnaam te gebruiken vlak achter het enum
trefwoord.
enum color
{
RED,
GREEN,
BLUE
};
Deze opsomming moet dan altijd worden gebruikt met het trefwoord en de tag als volgt:
enum color chosenColor = RED;
Als we typedef
rechtstreeks gebruiken bij het declareren van het enum
, kunnen we de typedef
weglaten en vervolgens het type zonder het enum
:
typedef enum
{
RED,
GREEN,
BLUE
} color;
color chosenColor = RED;
Maar in dit laatste geval kunnen we het niet als enum color
, omdat we de tagnaam niet in de definitie hebben gebruikt. Een veel voorkomende conventie is om beide te gebruiken, zodat dezelfde naam kan worden gebruikt met of zonder enum
trefwoord. Dit heeft het bijzondere voordeel dat het compatibel is met 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;
Functie:
void printColor()
{
if (chosenColor == RED)
{
printf("RED\n");
}
else if (chosenColor == GREEN)
{
printf("GREEN\n");
}
else if (chosenColor == BLUE)
{
printf("BLUE\n");
}
}
Zie typedef
voor meer informatie over typedef
Telling met dubbele waarde
Een opsommingswaarde hoeft op geen enkele manier uniek te zijn:
#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;
}
Het voorbeeld wordt afgedrukt:
Base = 0
One = 1
Two = 2
Negative = -1
AnotherZero = 0
opsomming constant zonder typenaam
Opsommingstypen kunnen ook worden gedeclareerd zonder ze een naam te geven:
enum { buffersize = 256, };
static unsigned char buffer [buffersize] = { 0 };
Dit stelt ons in staat compilatietijdconstanten van het type int
te definiëren die, zoals in dit voorbeeld, als arraylengte kunnen worden gebruikt.