Teilen über


C-Enumerationsdeklarationen

Eine Aufzählung besteht aus einer Reihe benannter ganzzahliger Konstanten. Eine Enumerationstypdeklaration gibt den Namen des (optionalen) Enumerationstags an. Außerdem definiert er den Satz von benannten ganzzahligen Bezeichnern (als Enumerationssatz, Enumerationskonstanten, Enumerationskonstanten, Enumerationszeichen oder Member bezeichnet). Eine Variable des Enumerationstyps speichert einen der Werte des durch diesen Typ definierten Enumerationssatzes.

Variablen vom enum Typ können inDizierungsausdrücken und als Operanden aller arithmetischen und relationalen Operatoren verwendet werden. Enumerationen bieten eine Alternative zur #define Präprozessordirektive mit den Vorteilen, die die Werte für Sie generiert werden können, und befolgen Sie normale Bereichsregeln.

In ANSI C haben int die Ausdrücke, die den Wert einer Enumeratorkonstante definieren, immer Typ. Das bedeutet, dass der speicher, der einer Enumerationsvariable zugeordnet ist, der für einen einzelnen int Wert erforderlich ist. Eine Enumerationskonstante oder ein Wert des Aufzählungstyps kann an einer beliebigen Stelle verwendet werden, an der die Sprache C einen ganzzahligen Ausdruck zulässt.

Syntax

enum-specifier:
enum identifier optieren{enumerator-list}
enum identifier

enumerator-list:
enumerator
enumerator-list , enumerator

enumerator:
enumeration-constant
enumeration-constant = constant-expression

enumeration-constant:
identifier

Die optionalen identifier Namen des durch enumerator-list. Dieser Bezeichner wird häufig als "Tag" der in der Liste angegebenen Aufzählung bezeichnet. Ein Typbezeichner deklariert identifier das Tag der durch das enumerator-list Nonterminal angegebenen Aufzählung, wie hier gezeigt:

enum identifier
{
    // enumerator-list
}

Die enumerator-list Elemente des Enumerationssatzes werden definiert.

Wenn die Deklaration eines Tags sichtbar ist, werden spätere Deklarationen, die das Tag verwenden, jedoch den zuvor deklarierten Enumerationstyp weglassen enumerator-list . Das Tag muss auf einen definierten Enumerationstyp verweisen, und dieser Enumerationstyp muss sich im aktuellen Bereich befinden. Da der Enumerationstyp an anderer Stelle definiert ist, wird dies enumerator-list in dieser Deklaration nicht angezeigt. Deklarationen von Typen, die von Enumerationen und typedef Deklarationen für Enumerationstypen abgeleitet sind, können das Enumerationstag verwenden, bevor der Enumerationstyp definiert wird.

Jeder enumeration-constant in einem enumerator-list Namen einen Wert des Enumerationssatzes. Standardmäßig ist der erste enumeration-constant dem Wert 0 zugeordnet. The next enumeration-constant in the list is associated with the value of ( constant-expression + 1 ), unless you explicitly associated it with another value. Der Name eines Elements enumeration-constant entspricht dem Wert.

Sie können die enumeration-constant = constant-expression Standardabfolge von Werten überschreiben. Dies ist, wenn enumeration-constant = constant-expression sie in der enumerator-listDatei angezeigt wird, dem enumeration-constant von .constant-expression Der constant-expression Typ muss int sein und kann negativ sein.

Die folgenden Regeln gelten für die Member eines Enumerationssatzes:

  • Ein Enumerationssatz kann doppelte Konstantenwerte enthalten. Sie können z. B. den Wert 0 zwei verschiedenen Bezeichnern zuordnen, z. B. member named null and zero, in the same set.

  • Die Bezeichner in der Enumerationsliste müssen sich von anderen Bezeichnern im selben Bereich mit der gleichen Sichtbarkeit unterscheiden. Dazu gehören gewöhnliche Variablennamen und Bezeichner in anderen Enumerationslisten.

  • Enumerationstags entsprechen den normalen Bereichsregeln. Sie müssen sich von anderen Enumerations-, Struktur- und Unionstags mit der gleichen Sichtbarkeit unterscheiden.

Beispiele

In diesen Beispielen werden Enumerationsdeklarationen veranschaulicht:

enum DAY            /* Defines an enumeration type    */
{
    saturday,       /* Names day and declares a       */
    sunday = 0,     /* variable named workday with    */
    monday,         /* that type                      */
    tuesday,
    wednesday,      /* wednesday is associated with 3 */
    thursday,
    friday
} workday;

Der Wert 0 ist standardmäßig zugeordnet saturday . Der Bezeichner sunday ist explizit auf 0 festgelegt. Die verbleibenden Bezeichner erhalten standardmäßig die Werte 1 bis 5.

In diesem Beispiel wird der Variablen todayein Wert aus dem Satz DAY zugewiesen.

enum DAY today = wednesday;

Der Name der Enumerationskonstante wird verwendet, um den Wert zuzuweisen. Da der Enumerationstyp DAY zuvor deklariert wurde, ist nur das Enumerationstag DAY erforderlich.

Wenn Sie einer Variablen eines aufgezählten Datentyps explizit einen ganzzahligen Wert zuweisen möchten, verwenden Sie einen Typ cast:

workday = ( enum DAY ) ( day_value - 1 );

Diese Umwandlung wird in C empfohlen, ist aber nicht erforderlich.

enum BOOLEAN  /* Declares an enumeration data type called BOOLEAN */
{
    false,     /* false = 0, true = 1 */
    true
};

enum BOOLEAN end_flag, match_flag; /* Two variables of type BOOLEAN */

Diese Deklaration kann auch als

enum BOOLEAN { false, true } end_flag, match_flag;

oder als

enum BOOLEAN { false, true } end_flag;
enum BOOLEAN match_flag;

Ein Beispiel, in dem diese Variablen verwendet werden, kann wie folgt aussehen:

if ( match_flag == false )
    {
     .
     .   /* statement */
     .
    }
    end_flag = true;

Nicht benannte Enumerationsdatentypen können ebenfalls deklariert werden. Der Name des Datentyps wird nicht angegeben, variablen können jedoch deklariert werden. Die Variable ist eine Variable response des definierten Typs:

enum { yes, no } response;

Siehe auch

Enumerationen(C++)