Wenn Sie eine Aufzählung wie unten gezeigt deklarieren, setzen alle C-Compiler die Standardwerte als x=0
, y=1
und z=2
sowohl auf Linux- als auch auf Windows-Systemen?
typedef enum {
x,
y,
z
} someName;
SS
Wenn Sie eine Aufzählung wie unten gezeigt deklarieren, setzen alle C-Compiler die Standardwerte als x=0
, y=1
und z=2
sowohl auf Linux- als auch auf Windows-Systemen?
typedef enum {
x,
y,
z
} someName;
Ja. Sofern Sie bei der Definition der Enumeration nichts anderes angeben, hat der erste Enumerator immer den Wert Null und der Wert jedes nachfolgenden Enumerators ist um eins größer als der vorherige Enumerator.
und dieses identische Verhalten wird sowohl von C als auch von C++ benötigt. In C++ ist es [dcl.enum]
: “Wenn der erste Enumerator keinen Initialisierer hat, ist der Wert der entsprechenden Konstante Null. Eine Enumerator-Definition ohne Initialisierer gibt dem Enumerator den Wert, der durch Erhöhen des Wertes des vorherigen Enumerators um eins erhalten wird.”
– Ben Voigt
22. Juni 2011 um 2:06 Uhr
Ja, und auch andere Sprachen, die mit dem Buchstaben C beginnen, wie C#.
– James McNellis
22. Juni 2011 um 2:07 Uhr
Ciro Santilli OurBigBook.com
C99-Standard
Das N1265 C99-Entwurf sagt bei 6.7.2.2/3 “Enumeration specifiers”
Ein Enumerator mit = definiert seine Enumerationskonstante als Wert des konstanten Ausdrucks. Wenn der erste Enumerator keine hat
=
, ist der Wert seiner Aufzählungskonstante 0. Jeder nachfolgende Enumerator mit no = definiert seine Aufzählungskonstante als den Wert des konstanten Ausdrucks, der durch Addieren von 1 zum Wert der vorherigen Aufzählungskonstante erhalten wird. (Die Verwendung von Aufzählungszeichen mit = kann Aufzählungskonstanten mit Werten erzeugen, die andere Werte in derselben Aufzählung duplizieren.)
Für konforme Implementierungen gilt also immer:
Haupt c
#include <assert.h>
#include <limits.h>
enum E {
E0,
E1,
E2 = 3,
E3 = 3,
E4,
E5 = INT_MAX,
#if 0
/* error: overflow in enumeration values */
E6,
#endif
};
int main(void) {
/* If unspecified, the first is 0. */
assert(E0 == 0);
assert(E1 == 1);
/* Repeated number, no problem. */
assert(E2 == 3);
assert(E3 == 3);
/* Continue from the last one. */
assert(E4 == 4);
assert(E5 == INT_MAX);
return 0;
}
Kompilieren und ausführen:
gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out
Getestet in Ubuntu 16.04, GCC 6.4.0.
Vignesh Vicky
Wenn der erste Wert der Enum-Variablen nicht initialisiert wird, weist der C-Compiler automatisch den Wert 0 zu. Der Compiler erhöht den Wert der vorangehenden Enum-Variablen weiterhin um 1.
Z.B:
enum months{jan,feb,mar}
Erläuterung: Der Wert von jan ist 0, feb ist 1, mar ist 2.
enum months{jan=123,feb=999,mar}
Erläuterung: Der Wert von jan ist 123, feb ist 999, mar ist 1000.
enum months{jan='a',feb='s',mar}
Erläuterung: Der Wert von jan ist ‘a’, feb ist ‘s’, mar ist ‘t’.
mar sein 't'
nicht garantiert wird, kann es Zeichensätze geben, bei denen die Buchstaben nicht in fortlaufender alphabetischer Reihenfolge sind
– MM
27. Mai 2019 um 5:25 Uhr
Ja, Aufzählungswert standardmäßig von 0 bis zum n-ten Element für jede Plattform.
Ja, es wird von den Standards verlangt, und ich bin sicher, dass jemand in der Lage sein wird, sie zu zitieren.
– Nemo
22. Juni 2011 um 2:05 Uhr