Inkrement- und Dekrementoperatoren

Neue Frage »

Auf diesen Beitrag antworten »
SixFeetUnder Inkrement- und Dekrementoperatoren

Meine Frage:
Hallo zusammen,

ich habe das folgende Programm:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
package ausarbeitung;

public class Ausarbeitung 
{
    public static void main(String[] args) 
    {
        int x, a=5;
        x = a * a++ * ++a;                             
        System.out.println(x);
    }
}




Ich weiß, dass man so niemals programmieren würde; Trotzdem versuche ich mich an der Ausgabe.

Meine Ideen:
Folgendes Vorgehen:

Ich sehe mir die Zeile an, Inkrement-Operator hat eine höhere Priorität als das * - Zeichen. Da ich zwei Inkrement - Operatoren in meiner Zeile habe, erfolgt die Assoziativität von rechts. Also wird das ++a auf 6 gesetzt, somit ist a=6.

Also steht als Ausdruck:

code:
1:
 x = a * a++ * 6;  


Als nächstes ist dann a++ dran, hier müsste aber a auf 6 bleiben, da es Postinkrement ist.

Also habe ich:

code:
1:
 x = a * 6 * 6;  


Und erst jetzt wird a = 7;

Somit wäre die letzte Zeile:

code:
1:
 x = 7*6*6;  


Als Endergebnis dann 252. Meine IDE sagt aber 175.

Daher meine Frage an Euch, wo habe ich hier einen Fehler?

Vielen Dank
 
Auf diesen Beitrag antworten »
eulerscheZahl

Stichwort: linksassoziativ.
code:
1:
2:
3:
x = (a * a++) * ++a;
x = a * a++; //5 * 5 = 25
x *= ++a; //x *= 7 -> x =175
Auf diesen Beitrag antworten »
SixFeetUnder

Danke für die Rückmeldung Daumen hoch
Auf diesen Beitrag antworten »
SixFeetUnder

Eine Frage noch:

Ich habe den folgenden Code:

code:
1:
int sum = -5*6*-9/4;


Hier wird doch das unäre Minus zuerst der 9 (Assoziativität rechts) zugeordnet, dann das unäre Minus der 5. Danach kommt die Multiplikation (Assiziativität links), sprich -5*6 = -30;
Danach -30*-9 = 270 und zuletzt dann 270 / 4 = 67 (da es zwei Integer - Zahlen sind).

Ist das richtig von der Interpretation?
 
Auf diesen Beitrag antworten »
eulerscheZahl

Stimmt alles.
Auf diesen Beitrag antworten »
SixFeetUnder

Dankeschön :-)
Auf diesen Beitrag antworten »
SixFeetUnder

Irgendwie werden die Fragen nicht weniger :-)

code:
1:
2:
double a=3.59, b=7.98;         
System.out.println( (++b + -a++) / (b++) );


Welche Priorität haben denn eigentlich die Klammern? Ist die Assoziativität dann links oder rechts?
Auf diesen Beitrag antworten »
eulerscheZahl

/ arbeitet von links nach rechts.
Hier eine Zeile mit gleicher Ausgabe:
code:
1:
System.out.println( (8.98 + -3.59) / (8.98) );
Auf diesen Beitrag antworten »
SixFeetUnder

Also geht es garnicht um die Klammern, sondern nach der Zuweisung des unären Minus zu 3,59 sofort zu dem geteilt Zeichen?
Auf diesen Beitrag antworten »
eulerscheZahl

So sieht der Baum aus:
code:
1:
2:
3:
4:
      /
    +   b++
++b   -
     a++

Beim geteilt wird mit der Zerlegung begonnen. Das schreibt vor, erst die linke Seite abzuarbeiten, also das +.
Hier geht es wieder von links nach rechts, also erst das b erhöhen. Dann wird -(a++) addiert.
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »