Die Deppenaddition



  • //(1)
    a = a + b;
    
    //(2)
    a += b;
    

    Warum wird fast immer in Beispielen Variante (1) verwendet, obwohl sie nur Nachteile gegenüber (2) hat?

    Ja, ich möchte hier Haarspalterei betreiben.

    (2) drückt die Intention aus. Die Anweisung tut genau das, was ich möchte. Nicht mehr und nicht weniger. Kürzer und übersichtlicher geht es nicht. Man muss nur die Bedeutung von += kennen und alles ist klar.

    (1) hingegen ist aus zwei Operationen zusammengesetzt und verwendet a zwei mal. Man muss zum vollen Verständnis wissen, was = und + bedeuten, dass + kommutativ ist und dass die Addition vor der Zuweisung ausgewertet wird.

    Aber nein, (1) ist ja soooo viel einfacher zu verstehen, weil es so ähnlich aussieht wie die Äquivalenz in der Mathematik.
    Einen so schwierigen und problematischen Operator wie += kann und darf man keinem Anfänger zumuten!
    Zudem müssen Anfänger vor der Idee geschützt werden, dass man das binäre + üblicherweise mit += implementiert. Wo kommen wir denn da hin, wenn der spezielle Operator sich mit dem allgemeineren ausdrücken lässt und damit Code-Redundanz erspart? Arbeitsplätze und so!



  • Komm. Unnötigere Themen hab ich selten gesehen.
    Welche Beispiele? Hab noch nie ein solches gesehen, keine Ahnung was für Seiten du da kennst. Wie auch immer. 1 hat absolut keine Nachteile hingegen 2 (außer das gezeigte ist in einem Makro, was wiederum auch keine Nachteile produziert, wenn man die Problematik versteht).



  • Hacker schrieb:

    Komm. Unnötigere Themen hab ich selten gesehen.

    Musst ja nicht antworten.

    Hacker schrieb:

    Welche Beispiele? Hab noch nie ein solches gesehen, keine Ahnung was für Seiten du da kennst.

    hier, von heute
    Wird aber auch grundsätzlich in Tutorials und Vorlesungen so gemacht.

    Hacker schrieb:

    Wie auch immer. 1 hat absolut keine Nachteile hingegen 2 (außer das gezeigte ist in einem Makro, was wiederum auch keine Nachteile produziert, wenn man die Problematik versteht).

    Guter Einfall, auf das Makro-Problem bin ich gar nicht gekommen.
    Ein Anfänger versteht aber nicht die Problematik. Er sieht nur die Schreibweise (1) und gewöhnt sich die an. "Machen alle so, mach ich auch so". Für sich gesehen ist die Schreibweise nicht schlimm, aber sie behindert das Verständnis. Wenn der fortgeschrittene Anfänger dann eine Matrix-Klasse schreibt, wird += entweder weggelassen oder mit + nachgebaut.



  • TyRoXx schrieb:

    Hacker schrieb:

    Komm. Unnötigere Themen hab ich selten gesehen.

    Musst ja nicht antworten.

    Nein 😃 , ich meine es war absolut nicht wert deswegen einen Thread zu eröffnen, denn wegen solch' trivialer Themen gibt es schon genug (die auch geschlossen wurden).

    Wird aber auch grundsätzlich in Tutorials und Vorlesungen so gemacht.

    Schade. Dieser (vom Kontext her besser verständliche) arithmetische Operator ist in einem Satz zu erklären und lässt sich auch auf deine erste Schreibweise reduzieren.



  • Ich würde sagen, dass (1) oft einfach verwendet wird, weil mans gerade nicht weiss.

    Passiert mir auch immer mal wieder, dass ich etwas kleines in einer anderen Sprache mache und gerade nicht weiss, ob es den += Operator gibt oder nicht und mach darum (1).

    Eine andere Quelle (meine Vermutung) wäre refactoring. Man hatte z.B mal so etwas:

    a = b*a+1
    

    und die anderen Variablen/Werte mal entfernt und gerade eben nicht auch den anderen Operator genommen.



  • TyRoXx schrieb:

    ...und damit Code-Redundanz erspart?

    Ähm...du willst jetzt also tatsächlich behaupten, dass "a = a + b;" in mehr Binärcode resultiert? Autsch...als nächstes lässt du dann wohl auch Kommentare weg, damit die Binaries kleiner werden...



  • WaHoooo schrieb:

    TyRoXx schrieb:

    ...und damit Code-Redundanz erspart?

    Ähm...du willst jetzt also tatsächlich behaupten, dass "a = a + b;" in mehr Binärcode resultiert?



  • WaHoooo schrieb:

    TyRoXx schrieb:

    ...und damit Code-Redundanz erspart?

    Ähm...du willst jetzt also tatsächlich behaupten, dass "a = a + b;" in mehr Binärcode resultiert?

    Gemeint ist eindeutig, dass man den + Operator für benutzerdefinierte Typen nach Schema F mithilfe des += Operators implementieren kann ( Foo temp(lhs); temp+=rhs; return temp; ), während man umgekehrt die vorhandene Implementation des + nicht vernünftig für einen += verwenden kann.



  • Bashar schrieb:

    während man umgekehrt die vorhandene Implementation des + nicht vernünftig für einen += verwenden kann.

    *HUST* bitte? Was heißt unvernüftig?



  • Hacker schrieb:

    Bashar schrieb:

    während man umgekehrt die vorhandene Implementation des + nicht vernünftig für einen += verwenden kann.

    *HUST* bitte? Was heißt unvernüftig?

    Foo& operator+=(Bar const& bar)
    {
        *this = *this + bar;
        return *this;
    }
    

    Das ist nicht vernünftig, da sinnlos rumkopiert wird. Außerdem muss das Objekt überhaupt kopierbar sein.



  • TyRoXx schrieb:

    //(1)
    a = a + b;
    
    //(2)
    a += b;
    

    Warum wird fast immer in Beispielen Variante (1) verwendet

    Echt?



  • TyRoXx schrieb:

    Musst ja nicht antworten.

    Musst den Thread ja auch nicht erstellen.



  • Ethon schrieb:

    Hacker schrieb:

    Bashar schrieb:

    während man umgekehrt die vorhandene Implementation des + nicht vernünftig für einen += verwenden kann.

    *HUST* bitte? Was heißt unvernüftig?

    Foo& operator+=(Bar const& bar)
    {
        *this = *this + bar;
        return *this;
    }
    

    Das ist nicht vernünftig, da sinnlos rumkopiert wird. Außerdem muss das Objekt überhaupt kopierbar sein.

    Foo const operator+(Bar const& bar)
    {
        Foo temp(*this); 
        temp += bar; 
        return temp;
    }
    

    Und hier ist irgendetwas anders?



  • edit: Fairerweise Zitat entfernt.

    Hacker schrieb:

    Und hier ist irgendetwas anders?

    Das ist operator+, da muss sowieso kopiert werden. Es ging um operator+=. Wenn man den mithilfe von operator+ implementiert, dann hat man da eine sinnlose Kopie.

    Bringt dir das eigentlich was, bei dem Thema so rumzudiskutieren? Wenn du es besser weißt, dann sag es einfach explizit. Falls nicht -- und es sieht leider danach aus -- lies deinen Scott Meyers oder was man so an Anfängerliteratur heutzutage empfiehlt.



  • Zumal schon der Unterschied erwähnt wurde 🙄



  • Hacker schrieb:

    Komm. Unnötigere Themen hab ich selten gesehen.

    Aber Hauptsache rege mitdiskutieren, wie?



  • Sehe da keine Verbindung zu 'Deppen', Anfänger kennen eben noch nicht alle Befehle.


Anmelden zum Antworten