Seltermann: Kurioses Inkrementieren

Hallo Prog.-Freunde,
ich hab eine Frage zur Inkrementierung mit den Post-Operatoren.
Folgender Code gibt nicht das erwartete Ergebnis zurück.

var i=4;
var j=1;

i *= i++;

j = i * 2;

document.write(j);

Als Ergebnis kommt 32 raus. Warum nicht 34?
"i" müsste in der letzten Zeile 17 sein, ist aber 16.

Die Pre-Operatoren sind klar. Mit "i *= ++i;" ist i=20 und j=40.

Im Internet hab ich gesucht und gesucht und hier im Forum auch,
aber nichts gefunden.

Dann schon mal Danke für jede hilfreiche Antwort.

  1. Folgender Code gibt nicht das erwartete Ergebnis zurück.

    Doch, Seltermann. Abhängig von der Erwartung. ;-)

    var i=4;
    i *= i++;
    "i" müsste in der letzten Zeile 17 sein, ist aber 16.

    Nö. Ja.

    i *= i++ heißt i = i * i++

    Es wird also 4 * 4 = 16 berechnet, i um eins erhöht auf 5, dann die 16 dem i zugewiesen.

    Live long and prosper,
    Gunnar

    --
    „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
  2. Hi,

    i *= i++;

    Don't do that ...

    Es ist zwar garantiert, daß die Erhöhung durch das ++ nach dem Auslesen des Werts des rechten i geschieht, aber nicht, wann genau.

    Der Interpreter geht wohl wie folgt vor:

    links vom *= findet er i - da holt er schon mal den Wert (also 4)
    Jetzt kommt der rechte Teil an die Reihe - der zweite Faktor ist i (also 4).
    Jetzt wird das ++ ausgeführt. i ist also 5.
    Jetzt werden die beiden Faktoren (4 und 4) miteinander multipliziert und das Ergebnis in i gespeichert (i ist jetzt also 16).

    Grundregel: wenn in einer Expression auf eine Variable ein Prä- oder Post- In- oder De- krement Operator angewandt wird, darf dieselbe Variable im selben Ausdruck nicht noch ein weiteres Mal vorkommen.
    (ist zwar syntaktisch kein Fehler, aber wie Du ja selbst gemerkt hast, sind die Effekte nicht wirklich durchschaubar - "darf nicht" ist also keine von der Programmiersprache vorgegebene Regel)

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  3. Danke für eure schnelle Hilfe.

    Eigentlich auch logisch, jetzt wo mans weiss. Danke.  :-)

    1. Hallo Seltermann.

      Eigentlich auch logisch, jetzt wo mans weiss. Danke.  :-)

      „Kaum macht man es richtig,
      schon gehts.“ [dan]

      Einen schönen Dienstag noch.

      Gruß, Ashura

      --
      sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
      <mathbr:del.icio.us />