Anfängerfrage: enum {};



  • Zuerstmal sorry für den sch*** Betreff, aber ich weiss wirklich nicht, was ich sonst hätte schreiben sollen...

    Also ich habe eine Frage zu diesem Code:

    #include <iostream.h>
    
    int main()
     {
        enum Days { Sunday, Monday, Tuesday, 
                    Wednesday, Thursday, Friday, Saturday };
        int choice; 
        cout << " Geben Sie einen Tag  ein (0-6): ";
        cin >> choice;
        if (choice == Sunday || choice == Saturday)
        cout << "\nSie sind bereits im Wochenende!\n";
        else
        cout << "\nOkay, legen Sie einen Urlaubstag ein.\n";
        cin >> choice;
        return 0;
     }
    

    Weshalb erhält "choice" die Werte von "Days"? Sorry wenn ich was falsch verstanden habe, aber diese Zeile verwirrt mich ein wenig:

    if (choice == Sunday || choice == Saturday)
    

    Naja, ich hoffe ihr versteht was ich meine... ich möchte einfach wissen, wie z.B. "Sunday" und "Saturday" in "choice" kommen. Denn es steht ja nirgends, dass in "choice" die Tage gespeichert werden sollen, sonder nur, dass "choice" erstellt wird (int coice;)...
    Bitte nicht böse sein, wenn die Frage sehr dumm ist, oder ich was verdrehe, aber ich bin (leider) noch blutiger Anfänger 🙂
    mfg titeuf



  • cin >> choice;
    

    liest die Benutzereingabe in choice ein.

    if (choice == Sunday || choice == Saturday)
    

    ist gleichbedeutend mit

    if (choice == 0 || choice == 6)
    


  • enum erzeugt symbole, die bestimmte Integer Werte besitzen. Die Werte werden von 0 an durchgezählt, du kannst diese aber auch explizit setzen

    enum foo { bar,baz=10 };
    

    bar entspricht hier dem Wert 0 und baz dem Wert 2



  • 2? Warum nicht 10?



  • Jeder enum-Konstante ist eine Ganzzahl zugeordet (muss nicht unbedingt int sein). Die erste in der Auflistung bekommt die 0, alle weiteren jeweils 1 mehr. Man kann auch selbst Werte vergeben:

    enum foo { a, b = 25, c, d };
    

    => a = 0, b = 25, c = 26, d = 27

    Weiterhin werden enum falls erforderlich implizit in int umgewandelt, das passiert bei dem Vergleich in deinem Programm. Der umgekehrte Weg ist nur über eine explizite Umwandlung gangbar:

    Days d;
    // d = 3; -- Fehler
    d = static_cast<Days>(3); // ok
    


  • das ging ja schnell 😮 danke!
    Aber - sorry - irgendwie hab ich den Durchblick immer noch nicht ganz... 🙄

    Ist das per Definition so, dass man nach "enum foo {}" einen int/short/long/etc. erstellen muss, in dem die Werte dann gespeichert sind?
    Ich denke schon... denn sonst könnte man das Ganze ja auch so machen:

    if (Days == Sunday || choice == Saturday)
    

    Und wie werden die Werte von Days (0,1,2,3,4...) an den Integer choice übergeben?
    ich weiss ich bin ein fragenkind... 🙂



  • Du liest doch choice ein. Und dein enum ist im Grunde nichts anderes als eine Sammlung von ints.
    Wenn ich das mal so vereinfach darstellen darf. 🤡



  • titeuf schrieb:

    Ist das per Definition so, dass man nach "enum foo {}" einen int/short/long/etc. erstellen muss, in dem die Werte dann gespeichert sind?

    Nein, ein enum ist ein Datentyp, von dem du ganz normal Instanzen erstellen kannst:

    enum Days { ... };
    Days d;
    d = Sunday;
    

    Das Problem ist, dass man die nicht direkt eingeben lassen kann:

    cin >> d; // ???
    

    geht nicht.

    Also läßt man die zugehörige Zahl eingeben ... das könnte z.B. so gemacht werden:

    cin >> static_cast<int&>(d);
    

    (Wahrscheinlich) weil das nicht besonders prickelnd aussieht, hat man sich in deinem Programm dazu entschlossen, die enum-Deklaration zu einer Sammlung von Konstanten herabzustufen, und die eigentliche Arbeit mit einem int zu machen. Das muss man aber nicht machen, die Entscheidung ist eine Abwägung zwischen Typsicherheit (enum-Variablen) und Bequemlichkeit (int-Variablen).



  • alles klar! danke für eure Hilfe! 👍
    (*sich-auf-die-bücher-stürz-und-lern*) fg titeuf


Anmelden zum Antworten