15.10 Der Aufzählungstyp »enum«
Das Schlüsselwort enum dient zur Aufzählung von Konstanten. Mit dieser Struktur lassen sich beim Programmstart eine Reihe von Konstanten festlegen. Ein Beispiel:
/* enum1.c */ #include <stdio.h> #include <stdlib.h> enum zahl { NU_LL, EINS, ZWEI, DREI, VIER}; int main(void) { enum zahl x; x=NU_LL; printf("%d\n",x); x=EINS; printf("%d\n",x); x=ZWEI; printf("%d\n",x); x=DREI; printf("%d\n",x); x=VIER; printf("%d\n",x); return EXIT_SUCCESS; }
Bei Ausführung des Programms werden die Zahlen von null bis vier auf dem Bildschirm ausgegeben. Die Aufzählung lautet hier:
enum zahl { NU_LL, EINS, ZWEI, DREI, VIER };
In der Regel beginnt der Aufzählungstyp, sofern nicht anders angegeben, mit 0; also NU_LL=0. Das nächste Feld hat, wenn nicht anders angegeben, den Wert 1. Somit ist EINS auch 1. Gleichbedeutend hätte man dies auch so schreiben können:
enum zahl { NU_LL=0, EINS=1 ,ZWEI=2 ,DREI=3 ,VIER=4 };
Wird enum hingegen so benutzt:
enum farben { rot, gelb=6, blau, gruen };
würden folgende Konstanten definiert werden:
enum farben { 0, 6, 7, 8 };
Die Farbe gelb wurde mit dem Wert 6 initialisiert. Die Steigerung des Werts zur nächsten Konstante beträgt bei enum immer plus eins. Somit hat die Konstante blau den Wert 7 und gruen den Wert 8.
Häufig wird enum zur Nachbildung der booleschen Variablen verwendet. Hier sehen Sie das Beispiel dazu:
/* enum2.c */ #include <stdio.h> #include <stdlib.h> enum BOOL { FALSE, TRUE }; int main(void) { int zahl; printf("Gib mir eine Zahl (0-9): "); if( (scanf("%d",&zahl)) == FALSE ) printf("Das war keine Zahl!\n"); else printf("Vielen Dank!\n"); if( (zahl==7) == TRUE) printf("Wow, die 7, meine Lieblingszahl\n"); return EXIT_SUCCESS; }
Der Aufzählungstyp enum dient der besseren Lesbarkeit eines Programms. BOOL (in C++ gibt es diesen Datentyp wirklich) könnten Sie aber auch als Makro implementieren:
#define BOOL int #define FALSE 0 #define TRUE 1
Es gibt also viele Wege, die ans Ziel führen. Die zwölf Monate eines Jahres könnten Sie mit enum beispielsweise so realisieren:
enum Monate { JAN=1, FEB, MAR, APR, MAI, JUN, JUL, AUG, SEP, OKT, NOV, DEC }
Oder mit define so:
#define JAN 1 #define FEB 2 #define MAR 3 #define APR 4 #define MAI 5 ...
Bei beiden Beispielen wurden die einzelnen Monate als Konstanten definiert.
Worin besteht dann der Unterschied zwischen enum und einer Reihe von Präprozessor-Defines? Ironischerweise besteht kaum ein Unterschied. Geplant war (laut ANSI-C-Standard) enum, um ohne Casts verschiedene integrale Typen vermischen zu können, was ja sonst in der Regel einen Compiler-Fehler zur Folge hat. So hätten eine Menge Programmierfehler aufgefangen werden können.
Aber enum hat auch Vorteile:
- Zahlenwerte werden automatisch zugewiesen.
- Debugger-Werte von enum-Variablen können symbolisch dargestellt werden.
- enum unterliegt auch der Sichtbarkeitsregel von C.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.