i++ ist nicht das selbe wie i=i++ ?!

  • hallo.

    mir ist heute ein interessantes problem untergekommen und ich kann es mir nicht ganz erklären.

    ich hab heute mit einem kollegen welcher gerade erst angefangen hat java zu programmieren ein bsp gecodet.

    normalerweise erhöhe ich ja eine variable einfach mit i++;

    er hatte in seinem code i=i++; und das liefert ein anderes ergebniss. syntaktisch müsste das doch genauso funktionieren, meiner meinung nach.

    ich habs dann ausprobiert:

    int i=0;
    i++;
    => i = 1;

    int i=0;
    i=i++;
    => i = 0;

    kann mir wer erklären warum das so ist?

    "In fact, you can look at the Web as consisting of two basic forms of knowledge: the database and the joke."
    david weinberger

  • In Kurzform i++ ist eher sowas wie { j = i; i = j + 1; return j; }
    wohingegen ++i sowas ist wie { i = i + 1; return i; }

    Let us be thankful we have commerce. Buy more. Buy more now. Buy. And be happy.

  • Auch wenn das Ergebnis natürlich in der jeweiligen Sprache ganz genau spezifiziert ist, und ich mal gehört habe dass jemand bei einem Einstellungstest beantworten musste was "a += ++a+a++" macht, ist die einzig sinnvolle Antwort: sowas schreibt man nicht.

    Ich hab es interessehalber mal ausprobiert, und festgestellt dass z.B. C/C++ und Java die Ausdrücke auf unterschiedliche Art und Weise auswerten. Insofern ist es sehr dumm sowas zu schreiben, weil es kaum jemand nachvollziehen kann und sicher irgendwann für Probleme sorgt (ist jetzt keine Kritik an Programmieranfängern, sondern an Personalchefs die glauben es wäre eine wichtige Fähigkeit wenn man sowas weiß).

    Einmal editiert, zuletzt von Christoph R. (6. November 2010 um 18:00) aus folgendem Grund: verschrieben

  • Auch wenn das Ergebnis natürlich in der jeweiligen Sprache ganz genau spezifiziert ist, und ich mal gehört habe dass jemand bei einem Einstellungstest beantworten musste was "a += ++a+a++" macht, ist die einzig sinnvolle Antwort: sowas schreibt man nicht.


    Bei "Grundlagen des Programmierens" bei den Maschinenbauern wird so etwas abgeprüft als online-tuwel-test, die richtige antwort bei denen war allerdings mit zahlen zu beantworten, imo ein witz solche fragen! (aber als tuwel online test natürlich kein problem, man könnts ja ausprobieren)

    interessant wär noch ob in dem fall der compiler erkennt das nichts passiert und es gleich wegoptimiert...

    Thomas

  • Ich hab mal von einem Professor gehört, dass der Fall nicht im Standard festgelegt ist und er hat ergänzt, dass mehrdeutige Zeilen wie die einfach vermieden werden sollten.
    Weiß allerdings nicht inwiefern es wahr ist.
    Edit: Da war die Rede von C

    MfG

  • Ich hab mal von einem Professor gehört, dass der Fall nicht im Standard festgelegt ist und er hat ergänzt, dass mehrdeutige Zeilen wie die einfach vermieden werden sollten.


    Genau das ist das problem, da aber meistens alle mit dem selben java compiler arbeiten funktioniert blöderweise fast immer gleich...

    in C gibts ja doch ein sammelsurium an compilern die unterschiedlich parsen...

    Thomas


  • Weiß allerdings nicht inwiefern es wahr ist.
    Edit: Da war die Rede von C

    doch doch, das stimmt schon. laut standard ist die auswertungsreihenfolge nur fuer '&&', '||', ',' und '?:' garantiert.

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • Was jetzt, für Java oder C? Java ist doch garantiert von links nach rechts.



    Also für '&&', '||' und ',' gilt auch in C es wird von links nach rechts ausgeführt, wobei für '&&' und '||' Lazy Evaluation zu beachten ist.

    a ? b : c

    Und hier is es irgendwie logisch, dass zunächst a ausgeführt werden muss. Sonst wüsste der Rechner doch gar nicht, ob er jetzt b oder c ausführen soll.

    Mit freundlichen Grüßen

  • a ? b : c

    Und hier is es irgendwie logisch, dass zunächst a ausgeführt werden muss. Sonst wüsste der Rechner doch gar nicht, ob er jetzt b oder c ausführen soll.

    So kann man das auch wieder nicht sagen. Wenn a z.B. “x++” ist, dann weiß er sofort durch Auswerten von x, ob er b oder c nehmen soll, könnte sich aber das Erhöhen von x durchaus noch eine Weile aufsparen. Und es ist sogar durchaus möglich, dass der Compiler durch Analyse des umliegenden Codes erkennen kann, dass x an dieser Stelle immer ==0 oder !=0 ist, dann braucht er nicht einmal das.

  • Was jetzt, für Java oder C? Java ist doch garantiert von links nach rechts.


    nachdem es in dem teil den ich zitiert habe um C geht, war auch meine aussage auf C bezogen. um das gings mir.
    fuer den rest gibts "man operator"

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!