Suche…


Bemerkungen

Enumerationen bestehen aus dem Schlüsselwort enum und einem optionalen Bezeichner, gefolgt von einer Enumeratorliste, die von geschweiften Klammern eingeschlossen ist.

Ein Bezeichner ist vom Typ int .

Die Enumerator-Liste hat mindestens ein Enumerator- Element.

Einem Enumerator kann optional ein konstanter Ausdruck vom Typ int "zugewiesen" werden.

Ein Enumerator ist konstant und ist entweder mit einem char , einer vorzeichenbehafteten Ganzzahl oder einer vorzeichenlosen Ganzzahl kompatibel. Was immer verwendet wird, ist implementierungsdefiniert . In jedem Fall sollte der verwendete Typ alle für die betreffende Aufzählung definierten Werte darstellen können.

Wenn kein konstanter Ausdruck „zugeordnet“ zu einem Enumerator und es ist der 1. Eintrag in einer Aufzählungsliste es Wert nimmt 0 , sonst den Wert des vorherigen Eintrags dauert , in der Aufzählungsliste plus 1.

Die Verwendung mehrerer "Zuweisungen" kann dazu führen, dass verschiedene Aufzähler derselben Aufzählung dieselben Werte tragen.

Einfache Aufzählung

Eine Aufzählung ist ein benutzerdefinierter Datentyp, der aus Integralkonstanten besteht, und jeder Integralkonstante wird ein Name zugewiesen. Schlüsselwort enum verwendet Aufzählungsdatentyp zu definieren.

Wenn Sie enum anstelle von int oder string/ char* , erhöhen Sie die Überprüfung der Kompilierzeit und vermeiden Fehler, wenn ungültige Konstanten übergeben werden. Außerdem dokumentieren Sie, welche Werte zulässig sind.

Beispiel 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);
}

Mit einer wie folgt definierten Hauptfunktion:

int main(){
    enum color chosenColor;
    printf("Enter a number between 0 and 2");
    scanf("%d", (int*)&chosenColor);
    printColor(chosenColor);
    return 0;
}
C99

Beispiel 2

(In diesem Beispiel werden festgelegte Initialisierer verwendet, die seit C99 standardisiert sind.)

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]);
}

Dasselbe Beispiel mit der Bereichsüberprüfung:

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

Es gibt verschiedene Möglichkeiten und Konventionen, um eine Aufzählung zu benennen. Die erste besteht darin, einen Tag-Namen direkt nach dem enum Schlüsselwort zu verwenden.

enum color
{ 
    RED, 
    GREEN, 
    BLUE 
};

Diese Aufzählung muss dann immer mit dem Schlüsselwort und dem Tag wie folgt verwendet werden:

enum color chosenColor = RED;

Wenn wir typedef direkt beim Deklarieren der enum , können wir den Tag-Namen weglassen und dann den Typ ohne das enum Schlüsselwort verwenden:

typedef enum 
{ 
    RED, 
    GREEN, 
    BLUE 
} color;

color chosenColor = RED;

Im letzteren Fall können wir es jedoch nicht als enum color , da wir den Tag-Namen nicht in der Definition verwendet haben. Eine gängige Konvention ist die Verwendung beider, so dass derselbe Name mit oder ohne enum . Dies hat den besonderen Vorteil, dass es mit C ++ kompatibel ist

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;

Funktion:

void printColor()
{
    if (chosenColor == RED)
    {
        printf("RED\n");
    }
    else if (chosenColor == GREEN)
    {
        printf("GREEN\n");    
    }
    else if (chosenColor == BLUE)
    {
        printf("BLUE\n");
    }
}

Weitere typedef zu typedef Sie unter Typedef

Aufzählung mit doppeltem Wert

Ein Aufzählungswert muss keinesfalls eindeutig sein:

#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;
}

Das Beispiel druckt:

Base = 0
One = 1
Two = 2
Negative = -1
AnotherZero = 0

Aufzählungskonstante ohne Typenname

Aufzählungstypen können auch deklariert werden, ohne ihnen einen Namen zu geben:

  enum { buffersize = 256, };
  static unsigned char buffer [buffersize] = { 0 };

Dies ermöglicht uns, Zeitkonstanten vom Typ int zu definieren, die wie in diesem Beispiel als Arraylänge verwendet werden können.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow