Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
--- Theoretische Informatik (http://www.informatikerboard.de/board/board.php?boardid=5)
---- Logik (http://www.informatikerboard.de/board/board.php?boardid=16)
----- Inkrement- und Dekrementoperatoren (http://www.informatikerboard.de/board/thread.php?threadid=2490)


Geschrieben von SixFeetUnder am 22.10.2015 um 01:06:

  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



Geschrieben von eulerscheZahl am 22.10.2015 um 05:57:

 

Stichwort: linksassoziativ.
code:
1:
2:
3:
x = (a * a++) * ++a;
x = a * a++; //5 * 5 = 25
x *= ++a; //x *= 7 -> x =175



Geschrieben von SixFeetUnder am 27.10.2015 um 05:48:

 

Danke für die Rückmeldung Daumen hoch



Geschrieben von SixFeetUnder am 27.10.2015 um 06:17:

 

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?



Geschrieben von eulerscheZahl am 27.10.2015 um 17:18:

 

Stimmt alles.



Geschrieben von SixFeetUnder am 28.10.2015 um 04:04:

 

Dankeschön :-)



Geschrieben von SixFeetUnder am 28.10.2015 um 04:18:

 

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?



Geschrieben von eulerscheZahl am 28.10.2015 um 05:56:

 

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



Geschrieben von SixFeetUnder am 29.10.2015 um 04:01:

 

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



Geschrieben von eulerscheZahl am 29.10.2015 um 05:51:

 

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.


Forensoftware: Burning Board, entwickelt von WoltLab GmbH