Anfänger versteht Lehrcode über Inkrement-Operatoren nicht [gelöst]



  • Ein herzliches "Hallo" in Forum 🙂

    Der Anfänger bin ich selbst. Habe vorgestern begonnen C++ zu lernen. Bisher habe ich alles verstanden, komme heute aber nicht mehr weiter.

    Es geht um die Inkrement-Operatoren. Genau genommen um den Lehrcode aus meinem Buch das ich vor 2 Tagen kaufte:

    #include <iostream>
    
    int main ()
    {
    int a = 5, b, a1 = 5, b1;
    
    b = a++;
    std::cout << "a: " << a << std::endl;
    std::cout << "b: " << b << std::endl;
    
    b1 = ++a1;
    std::cout << "a1: " << a1 << std::endl;
    std::cout << "b1: " << b1 << std::endl;
    }
    

    Das Resultat ist
    a: 6
    b: 5
    a1: 6
    b1: 6

    Ich verstehe das Resultat nicht. Der Grund: Ich verstehe die Code-Zeilen 5, 7 und 11 nicht. Ich weiß, was der Inkrement-Operator machen soll. Er addiert den Wert 1 hinzu.

    Meine konkrete Frage: Was genau sagen die Code-Zeilen 5, 7 und 11 aus?

    Liebe Grüße 🙂



  • Verstehst du
    int a;?
    int a = 5;?
    a=b;?



  • @Vert sagte in Anfänger versteht Lehrcode über Inkrement-Operatoren nicht:

    Stell die das ++ wie eine Funktion vor. Wenn das ++ vorne steht:

    int plusplus_vorne(int &n) {
       n = n + 1;
       return n;
    }
    
    // b = ++a1;
    b = plusplus_vorn(a1);
    

    Die Funktion plusplus_vorn erhöht den Wert der übergebenen Variablen um 1 und gibt diesen auch zurück.

    Hinten ist das wie folgt:

    int plusplus_hinten(int &n) {
       int kopie = n;
       n = n + 1;
       return kopie;
    }
    
    // b = a++;
    b = plusplus_hinten(a);
    

    Die Funktion plusplus_hinten erhöht den Wert der übergebenen Variablen um 1 und gibt danach den Wert vor der Erhöhung zurück.

    Alles klar?



  • In Zeile 5 kommt kein Inkrement-Operator vor. Wenn du damit Schwierigkeiten hast, musst du vielleicht nochmal ein paar Seiten zurückblättern?

    Zu den Operatoren: Ausdrücke können einen Wert und unabhängig davon einen Seiteneffekt haben. Beispielsweise ist std::cout << "Hallo" ein Ausdruck, der den Wert std::cout hat (es wird einfach der Stream zurückgegeben), während der Seiteneffekt die Ausgabe von "Hallo" ist. Ein Ausdruck wie 1+1 hat dagegen den Wert 2, aber keinen Seiteneffekt. Die Inkrement-Operatoren haben beide als Seiteneffekt die Inkrementierung des Operanden. Deshalb haben a und a1 in dem Beispiel danach den Wert 6. Der Wert unterscheidet sich: Beim Prefix-Operator ++a ist der Wert des Ausdrucks das Ergebnis nach der Inkrementierung (also hier 6), beim Postfix-Operator a++ ist der Wert des Ausdrucks der Wert des Operanden vor der Inkrementierung, also hier 5.



  • Hallo ihr Lieben.

    Ich freue mich, dass so rasch Antworten gekommen sind 🙂

    Lasst uns mal zusammen schauen, ob ich es jetzt verstanden habe 👶

    In Zeile 5 besitzen nur die Variablen 'a' und 'a1' den Wert 5. 'b' und 'b1' jedoch nicht, da 'int' keine Buchstaben "verarbeitet", sondern nur ganze Zahlen?
    Wenn ich Zeile 5 so wie sie ist per cout Befehl ausgeben lasse, besitzen 'b' und 'b1' merkwürdige Zahlenwerte: b -> 4201136 und b1 -> 1967283140. Ist das ASCII Code?

    Daher wird dann in Zeile 7 der Wert von b definiert und in Zeile 11 der Wert von b1?
    Ich habe jetzt auch verstanden das a++, oder ++a = 6 bedeutet und sich dabei auf die Variable a bezieht.



  • PS: Mist, sollte noch gar nicht abgeschickt sein ...

    Zeile 7 drückt also aus, dass 'b' nicht den Wert 6 wie 'a' hat, sondern 5 wie 'a' in Zeile 5.

    Und in Zeile 11 wird gesagt, dass b1 den Wert von a1+1 hat.



  • @Vert sagte in Anfänger versteht Lehrcode über Inkrement-Operatoren nicht:

    Meine konkrete Frage: Was genau sagen die Code-Zeilen 5, 7 und 11 aus?

    in zeile 5 werden die 4 variablen a,b,a1 und b1 angelegt. a und a1 werden auf 5 gesetzt. b und b1 haben noch keinen definierten inhalt.



  • @Vert sagte in Anfänger versteht Lehrcode über Inkrement-Operatoren nicht:

    In Zeile 5 besitzen nur die Variablen 'a' und 'a1' den Wert 5. 'b' und 'b1' jedoch nicht, da 'int' keine Buchstaben "verarbeitet", sondern nur ganze Zahlen?

    In Zeile 5 werden 4 Variablen definiert. a und a1 werden zudem noch initialisiert (es wird erstmalig ein Wert zugewiesen)

    Wenn ich Zeile 5 so wie sie ist per cout Befehl ausgeben lasse, besitzen 'b' und 'b1' merkwürdige Zahlenwerte: b -> 4201136 und b1 -> 1967283140. Ist das ASCII Code?

    Da b und b1 noch kein Wert zugewiesen wurde, steht halt noch Müll an der Speicherstelle.

    Der Compiler sollte da aber auch eine Warnung ausgeben. Etwa: „Lesezugriff auf nicht initialisiert Variable“
    Es wird zwar ein Programm erzeugt, der Compiler ist aber der Meinung, dass etwas merkwürdig ist und du nochmal nachschauen solltest.

    Wenn du keine Warnung bekommen hast, ändere den Warn-Level.
    Und beachte auch die Warnungen. Wenn du die nicht verstehst, frag (hier) nach.

    Daher wird dann in Zeile 7 der Wert von b definiert und in Zeile 11 der Wert von b1?

    b und b1 wird ein Wert zugewiesen.

    Ich habe jetzt auch verstanden das a++, oder ++a = 6 bedeutet und sich dabei auf die Variable a bezieht.

    Wenn da a steht, sollte auch a gemeint sein.

    Die Auswertung eines Ausdrucks (z.B. der Teil rechts von der Zuweisung) interessiert sich nicht um den Teil links vom =



  • @DirkB sagte in Anfänger versteht Lehrcode über Inkrement-Operatoren nicht:

    In Zeile 5 werden 4 Variablen definiert. a und a1 werden zudem noch initialisiert (es wird erstmalig ein Wert zugewiesen)

    Okay ... das Buch wiederum nutzt andere "Fachbegriffe", wie z.B.: deklarieren. Ich wollte bewusst in eigenen Worten (vorerst) wiedergeben, was ich meinte - verstanden zu haben.

    Da b und b1 noch kein Wert zugewiesen wurde, steht halt noch Müll an der Speicherstelle.

    Okay, aber was genau ist dieser Müll denn eigentlich? Also kein ASCII Code? Vielleicht die Position im Speicher?

    Der Compiler sollte da aber auch eine Warnung ausgeben. Etwa: „Lesezugriff auf nicht initialisiert Variable“
    Es wird zwar ein Programm erzeugt, der Compiler ist aber der Meinung, dass etwas merkwürdig ist und du nochmal nachschauen solltest.

    Wenn du keine Warnung bekommen hast, ändere den Warn-Level.
    Und beachte auch die Warnungen. Wenn du die nicht verstehst, frag (hier) nach.

    Als Compiler wurde mir vom Buch minGW vorgegeben. Da er keine Benutzeroberfläche zu haben scheint, weiß ich leider nicht, wie ich dort Warnstufen einstelle.
    in meinen Experimenten habe ich Warnungen über den vom Buch vorgegebenen Texteditor Programm "Geany" bekommen. Die habe ich auch immer verstanden.

    Insgesamt habe ich das Gefühl, einen grundlegenden Durchblick bekommen zu haben.

    Es ist für mich noch alles sehr neu und ich muss zugeben, ich bin extrem schwach in Mathematik 😎

    Wenn ich mal wider nicht weiter komme, melde ich mich wieder. Ich bedanke mich für eure Hilfe 🙂



  • @Vert sagte in Anfänger versteht Lehrcode über Inkrement-Operatoren nicht [gelöst]:

    Okay, aber was genau ist dieser Müll denn eigentlich? Also kein ASCII Code? Vielleicht die Position im Speicher?

    Es ist undefiniertes Verhalten, nicht initialisierte Variablen zu lesen. Es kann irgendwas passieren. Wahrscheinlich werden die Daten, die zufällig gerade im Speicher sind (oder im Register stehen oder was auch immer der Compiler da macht), ausgegeben. Und da "int" eine Zahl ist, werden diese eben als Zahl interpretiert. Aber wie gesagt, laut C++-Sprachstandard ist das Verhalten undefiniert.

    Siehe auch https://en.cppreference.com/book/uninitialized

    Zu den Warnungen: gib beim Compilieren mal -Wall -Wextra als zusätzliche Parameter an.



  • @Vert sagte in Anfänger versteht Lehrcode über Inkrement-Operatoren nicht [gelöst]:

    das Buch wiederum nutzt andere "Fachbegriffe", wie z.B.: deklarieren

    Nein.

    Unterschied: Deklaration, Definition, Initialisierung



  • @Vert sagte in Anfänger versteht Lehrcode über Inkrement-Operatoren nicht [gelöst]:

    Okay ... das Buch wiederum nutzt andere "Fachbegriffe", wie z.B.: deklarieren.

    Beim deklarieren wird nur bekannt gegeben, das etwas mit einem Namen existiert. Z.B. Typ (hier int) und Name (hier a) der Variable.

    Bei einer Definition wird auch Speicherplatz verbraucht.
    An diesem Speicherplatz stehen irgendwelche Werte - alte Daten/Code von einem beendeten Programm oder zufällige Daten vom Reset/Start des Rechners.

    Bei C++ beinhaltet eine Definition auch implizit eine Deklaration.

    @Vert sagte in Anfänger versteht Lehrcode über Inkrement-Operatoren nicht [gelöst]:

    Als Compiler wurde mir vom Buch minGW vorgegeben. Da er keine Benutzeroberfläche zu haben scheint, weiß ich leider nicht, wie ich dort Warnstufen einstelle.

    Das ist eine Portierung vom gcc (Gnu Compiler). da kommt ein -Wall in die Kommandozeile. Evtl als Zusatz bei Geany.

    Ich wiederhole das hier nochmal, weil es wichtig ist, dass wir mit denselben Fachbegriffen reden.



  • So langsam kommt Ordnung in mein Hirn, was Deklaration, Definition und Initialisierung angeht. Besser wenn es jetzt am Anfang schon klar ist, was damit gemeint ist 😎

    Habe auch einmal beim Kompilieren eines Testcodes -Wall mit angegeben und ja - wieder etwas gelernt 👏

    Ich möchte mich noch einmal bei euch bedanken, das ihr mir so sehr unter die Arme greift 😊



  • @Vert sagte in Anfänger versteht Lehrcode über Inkrement-Operatoren nicht [gelöst]:

    Lasst uns mal zusammen schauen, ob ich es jetzt verstanden habe 👶

    Das Smilie schaut ja krass aus. Ich hab da zuerst nicht an "Baby" sondern an Psychokiller mit Gasmaske gedacht.


  • Mod

    @Mechanics Bitte krieg niemals Kinder.


Log in to reply