Inkrementieren

Heinrich500

Bekanntes Mitglied
Hallo,
ich habe eine Variable int i mit einem bestimmten Wert. Jetzt bilde ich folgende Summe:
Java:
int j= i + i ++ //j=6 für i =3
//oder vertauscht:
int j= i++ +i // j=7
Ich verstehe nicht, warum sich die Werte unterscheiden. Das Inkrementieren hat doch die höhere Priorität als +. Wo liegt denn genau der Unterscheid?
 

httpdigest

Top Contributor
Java:
int j = i + i++;

// ist äquivalent zu:

int j = i + i;
i++;
wohingegen:
Java:
int j = i++ +i;

// ist äquivalent zu:

int tmp = i;
i++;
int j = tmp + i;
Das heißt, vor der zweiten Auswertung von `i` (bzw. dem zweiten Lesen von `i`) in dem Ausdruck `i++ + i` wurde `i` bereits durch das Post-Inkrement erhöht.
Die Auswertungsreihenfolge des binären `+` Operators ist links-nach-rechts. Das ist wichtig und hier entscheidend!
 

Heinrich500

Bekanntes Mitglied
Ich verstehe was du meinst. Jedoch ist mir nicht klar, warum das + eine Rolle spielen sollte. Unabhängig von der Addition wird doch immer zuerst das i++ wegen der höheren Priorität ausgeführt?
 

httpdigest

Top Contributor
Nein. Die Priorität gibt nicht an, wann der Operator überhaupt ausgeführt wird, wenn er in einem Ausdruck steht, sondern es gibt an, wie dieser Operator sich verhält, wenn andere Operatoren imselben Ausdruck vorkommen - bzw. wie stark der Operator die Operanden an sich bindet. Dafür braucht man die Priorität. Z.B. weißt du ja, dass `*` eine höhere Priorität hat als `+`, weswegen `1*2+3*4` ja auch als `(1*2)+(3*4)` ausgewertet wird und nicht als `1*(2+3)*4`.
 

Heinrich500

Bekanntes Mitglied
Jetzt verstehe ich es. Deshalb ist dann auch die Linksassoziativität von + entscheidend für die verschiedenen Werte.
In meinem Beispiel wäre dann also die Ausführung jeweils so:
Java:
int j= ((i++) + i)
//oder
int j= (i + (i++))
Nur zum Verständnis.
 

httpdigest

Top Contributor
Assoziativität ist nochmal wieder was anderes. Assoziativität gibt an, wie sich ein Operator verhält, wenn mehrere Operatoren derselben Priorität auf derselben Ebene in einem Ausdruck vorkommen. Also z.B. bei `1 + 2 + 3`. Hier ist dann nicht klar, ob es `(1+2)+3` oder `1+(2+3)` ist. Das ist z.B. wichtig bei dem Zuweisungsoperator oder dem ternären Operator `?:`. Bei einem Ausdruck wie `i++ + i` braucht man keine Mehrdeutigkeit durch Assoziativitätsregeln aufzulösen, da es nur jeweils einen Operator derselben Priorität in dem Ausdruck gibt.
Was hier entscheidend ist, ist die allgemeine Auswertungsreihenfolge der Operanden eines Operators. Und die ist eigentlich immer von links nach rechts.
Ein gutes Beispiel, wo man wirklich Assoziativität benötigt, ist der ternäre Operator `?:`. Hier ist die Assoziativität rechts-nach-links. Trotzdem wird bei `a ? b : c` aber immer zuerst natürlich `a` ausgewertet, um zu bestimmen, ob als nächstes `b` oder `c` auszuwerten sind. Aber bei mehrfacher Verwendung des Operators wie etwa in `a ? b : a2 ? b2 : c` muss wieder geklärt werden, was genau hier gemeint ist: `(a ? b : a2) ? b2 : c` oder `a ? b : (a2 ? b2 : c)`. Und hier ist Letzteres der Fall.
 

Heinrich500

Bekanntes Mitglied
Ok dann habe ich die beiden Begriffe durcheinander gebracht. In i++ + i werden also die die beiden + an das i gebunden. Hast du das vorher mit der Bindung so gemeint?
 

mrBrown

Super-Moderator
Mitarbeiter
wer kann eigentlich diesen Ausdruck NICHT lesen?

Zumindest in meinem Code könnte niemand den so lesen ;P


(ich hoffe ja, dass Java da dem Beispiel andere aktueller Sprachen folgt und ein Statement draus macht, aber da geht Abwärtskompatibilität wohl vor...)


Naja, wer würde das zur Menge der größeren Ausdrücke hinzuzählen? ;)
Ich :p

Oder anders formuliert, "... wer es als Expression und nicht als Statement nutzt, ..."
 

Ähnliche Java Themen

Neue Themen


Oben