2010-03-23 6 views
9

Wenn ich deklarieren eine Enum-Variable wie folgt aus:Was kann ich mit einer Enum-Variable tun?

enum paint_colors { RED, GREEN, BLUE, ...} colors; 

ist die colors Variable nützlich? Wenn ja, was kann ich damit machen?

Vielen Dank im Voraus.

+0

@drigoSkalWalker, habe ich Ihre Syntax für Sie behoben. Ich hoffe, ich habe die Frage richtig verstanden. –

+0

Ich habe jetzt viele Antworten abgelehnt. Schnellfeuerwaffen da draußen, zuerst lesen, später feuern. Er fragt nicht nach Enum-Werten, sondern nach Enum-Variablen. Alle Antworten außer der ersten ignorieren dies vollständig. – Suma

Antwort

9

Intern wird ein enum als ganze Zahl behandelt, die nur einen begrenzten Bereich von Werten enthalten kann. In diesem Fall werden die Konstanten RED, GREEN, BLUE, ... definiert und entsprechen 0, 1, 2, ... (jeweils). Die Variable colors kann überall verwendet werden, wo ein int verwendet werden kann. Sie können Operatoren wie ++ verwenden, um die Liste der Farben zu durchlaufen. Der einzige Unterschied zwischen enum paint_colors colors und int colors erklären ist, dass die aufgezählten Variable kann sollte nur eine der aufgezählten Konstanten zugeordnet werden.

Dies bietet Ihnen mehrere Vorteile gegenüber #define, um eine Reihe von Konstanten zu erstellen und einen normalen int für colors zu verwenden. Erstens können einige Debugger erkennen, dass colors ein Aufzählungstyp ist und den Namen der Aufzählungskonstante anstelle eines numerischen Werts anzeigen.

Noch wichtiger, dies kann eine zusätzliche Schicht der Typprüfung hinzufügen.Es ist vom C-Standard nicht erforderlich, aber einige Compiler überprüfen und stellen sicher, dass Werte, die einer Variablen vom Aufzählungstyp zugeordnet sind, einer der Aufzählungskonstanten entsprechen.

Geistig, kann man fast daran denken ähnlich sagen:

#define RED 0 
#define GREEN 1 
#define BLUE 2 
typedef int paint_colors; 
paint_colors colors; 

Die Variable wie ein int behandelt wird, aber es eine andere Art hilft explizit geben zu klären, was die Variable ist und was es ist, benutzt für.

0

Eine Enumeration ist hilfreich, wenn Sie eine bestimmte Menge möglicher Werte haben, wobei jeder Wert einen aussagekräftigen Namen hat. An anderer Stelle beziehen Sie sich auf die Enum-Werte und nicht auf "magische Zahlen", die unter anderem Code bedeutungslos werden können.

+0

Das ist nicht, was das OP fragt, denke ich. Er möchte wissen, wofür "Farben" gut sind. –

+0

Hmm, klar habe ich die Frage missverstanden. –

13

Wirklich, was Sie dort tun, deklariert eine Variable inline mit dem Rest der Definition der Aufzählung. Es ist äquivalent zu:

enum paint_colors { RED, GREEN, BLUE }; 
enum paint_colors colors; 

Oft Sie eine typedef mit der Definition zugeordnet sehen werden:

typedef enum _paint_colors { RED, GREEN, BLUE } paint_colors; 

, die Sie in Typen verwenden, um die Aufzählung mehr wie die errichtet wird, lässt:

paint_colors color; 

Also die Antwort auf Ihre Frage ist, dass colors eine Variable des Typs enum paint_colors ist, und kann verwendet werden, wie Sie denken, ist für eine solche Variable geeignet:

colors = RED; 
if (colors != GREEN) 
{ 
    colors = BLUE; 
} 

Und so weiter.

+0

es weiterhin nutzlos für mich, und für C. Ich kann int oder andere Typen stattdessen paint_color Typ verwenden, die variablen Farben sind immer noch nutzlos. – drigoSkalWalker

+0

@drigoSkalWalker, können Sie einige begrenzte Typchecking tun. Wenn Sie sie nicht verwenden wollen, müssen Sie nicht. Es kann jedoch nützlich sein. –

+2

Sie stellen jetzt zwei Fragen. Ob die _variable_ 'Farben' nützlich ist, hängt vom Rest des Programms ab. Der _type_ 'enum paint_colors' ist nützlich, da er die Absicht und den Wertebereich für diese Variable und andere kommuniziert - sie legt mehr Wert auf das Was ('dies ist eine von 3 Farben') und weniger auf das Wie ('das ist gespeichert als ein Int '). – Lars

1

Sie könnten eine Achterbahn malen!

typedef struct { 
    Color car; 
    Color door_handle; 
    Color wheels; 
} RollerCoasterColors; 

int main(void) { 
    RollerCoasterColors roller_coaster_colors; 
    roller_coaster_colors.car = RED; 
    roller_coaster_colors.door_handle = YELLOW; 
    roller_coaster_colors.wheels = PURPLE; 

    // now paint_roller_coaster() knows what colour to paint each part! 
    paint_roller_coaster(roller_coaster_colors); 
} 
+0

Das verwendet die 'colors' Variable überhaupt nicht, worum sich das OP gefragt hat. –

-1

Ich finde enums besonders nützlich beim Debuggen. Wenn Sie einfach #define verwenden, um Konstanten zu definieren, die als Werte für eine Variable verwendet werden, zeigt der Debugger die Zahl an. Mit enum können Sie die Namen anzeigen.

Und wenn Sie eine Reihe von möglichen Werten (Konstanten) für eine einzelne Variable benötigen, können Sie sie so definieren, wie Sie es gezeigt haben.

0

In C kann die Variable enum type iteriert werden, z. B. ++, +; Aber das ist in C++ nicht erlaubt;

enum WEEKDAY {MON, TUE, WED, THU, FRI, SAT, SUN, END}; 
for(WEEKDAY day = 0; day < END; day++){ 
    printf("day index = %d\n", day); 
} 

kann in C kompiliert werden, aber nicht in C++;

Verwandte Themen