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:
Und erst jetzt wird a = 7;
Somit wäre die letzte Zeile:
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
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