C/C++ Erstellen Sie eine Aufzählung mit negativen Werten, ohne sie nummerieren zu müssen

Lesezeit: 3 Minuten

Zum Beispiel in C/C++ hätte ich den Code:

typedef enum fruits{
   apple,
   banana,
   lemon,
   orange
} fruit_t;

Was äquivalent wäre zu:

typedef enum fruits{
   apple = 0,
   banana = 1,
   lemon = 2,
   orange = 3
} fruit_t;

Ich möchte jedoch, dass die Werte negativ sind, damit sie mit nichts anderem in Konflikt geraten. Ich könnte es so machen:

typedef enum fruits{
   apple = -1,
   banana = -2,
   lemon = -3,
   orange = -4
} fruit_t;

Aber wenn ich eine andere Frucht hinzufügen möchte, muss ich einen anderen Wert zuweisen, und wenn ich eine dazwischen setze, muss ich das meiste neu nummerieren. Gibt es eine einfachere Möglichkeit, dies zu tun?

  • Sie sollten bereichsbezogene C++11-Aufzählungen verwenden. Es gibt kein C/C++.

    – Leichtigkeitsrennen im Orbit

    9. Januar 2014 um 17:57 Uhr


  • @LightnessRacesinOrbit: Es sei denn, die Absicht besteht darin, eine Definition zu schreiben, die in beiden Sprachen verwendbar ist; in diesem Fall ist es durchaus sinnvoll, es “C/C++” zu nennen.

    – Mike Seymour

    9. Januar 2014 um 18:06 Uhr

Benutzer-Avatar
alk

Beginnen mit INT_MIN oben drauf so:

#include <limits.h>

enum fruits
{
  orange = INT_MIN,
  lemon, 
  ...
}

Pro “5.2.4.2.1 Größen von Integer-Typen ” und/oder “Anlage E/1” des C11-Standards INT_MIN ist mindestens -32767.

INT_MIN wird durch Einschließen definiert <limits.h>.

Benutzer-Avatar
Shafik Yaghmur

Im C Sie müssen nur den obersten Eintrag nummerieren, und nachfolgende Einträge sind der vorherige Eintrag +1dies ist in der abgedeckt C99-Standardentwurf Sektion 6.7.2.2 Aufzählungsbezeichner was sagt (Betonung von mir):

[…]Ein Enumerator mit = definiert seine Enumerationskonstante als Wert des konstanten Ausdrucks. Wenn der erste Enumerator kein = hat, ist der Wert seiner Enumerationskonstante 0. Jeder nachfolgende Enumerator mit no = definiert seine Enumerationskonstante als den Wert des konstanten Ausdrucks, der durch Addition von 1 erhalten wird auf den Wert der vorherigen Enumerationskonstante.[…]

und der Wortlaut ist ähnlich in der C++-Standardentwurf Sektion 7.2 Aufzählungserklärungen Absatz 2.

Machen Sie also einfach etwas Ähnliches wie das Folgende:

#define MIN -4

typedef enum fruits{
   orange = MIN,
   lemon,  
   banana,
   apple,
} fruit_t;

Benutzer-Avatar
Moha das allmächtige Kamel

Zunächst einmal gibt es kein “C/C++”, das sind zwei verschiedene Sprachen. Sie können C nicht als Teilmenge von C++ betrachten; Einige legale C-Codes lassen sich nicht als C++-Programm kompilieren.

Wenn Sie C++11 verwenden können, schlage ich vor, dass Sie verwenden enum classwas dir gibt stark typisierte Aufzählungen:

enum class Traffic {red , yellow, green};
Traffic t = Traffic::red;

if ( t == Traffic::red )  // to test the value of an enum 

Auf diese Weise können Sie garantieren, dass es zu keinen Konflikten kommt, da der Compiler keinen Vergleich mit einer Ganzzahl oder mit einer Variablen eines anderen Aufzählungstyps zulässt.

Sie können nur mit einer Variablen des gleichen Aufzählungstyps vergleichen oder den Binärbereichsauflösungsoperator wie im Beispiel verwenden.

Ein weiterer Vorteil davon enum class ist, dass Sie die Größe Ihrer Aufzählung festlegen können. Sie können jeden vorzeichenbehafteten oder vorzeichenlosen ganzzahligen Typ wie diesen verwenden:

enum class Traffic : char { red, yellow, green }

Wenn kein Typ angegeben ist, ist der Standardwert int wird angenommen.

Beachten Sie, dass Sie dafür einen Compiler mit C++11-Unterstützung benötigen.

Benutzer-Avatar
Tschad

Fügen Sie neue oben hinzu. Die oberste muss noch nummeriert werden.

enum fruit
{
   orange = -4,
   lemon,
   banana,
   apple,
};

Benutzer-Avatar
Digitale_Realität

Ich denke, du kannst es bestellen, wie du willst.

Wenn Sie keinen Wert angeben, dann als nächstes enum werde nehmen +1 seines vorherigen Wertes. Wenn auch Faust enum keinen Wert hat, dann wird damit begonnen 0.

Aber gute Praxis ist, es in der richtigen Reihenfolge zu haben.

Es ist auch üblich, die Fehler als übliche Aufzählungen zu deklarieren und den negativen Wert davon zu verwenden, wie zum Beispiel:

typedef enum fruits_e {
    APPLE=1,
    BANANA,
    LEMON,
    ORANGE
} fruit_t;

fruit_t eat_fastfood(void) {
    if (! me->healthy())
        return -APPLE;
}

1365940cookie-checkC/C++ Erstellen Sie eine Aufzählung mit negativen Werten, ohne sie nummerieren zu müssen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy