hi, allerseits. das ist ein tolles forum. ich habe hier angemeldet, weil ich gerade dabei bin Java und C zu erlernen, wobei der schwerpunkt zunächst auf Java liegt.
ich habe viele fragen, die ich loswerden will und hoffe ihr könnt mir dabei helfen. so ... nun auf zum ersten Problem
=====================================================================
In diesen Betrachtungen spielen Operator-Prioritäten, die Assoziativität und die Auswertungs-Reihenfolge von Operanden eine Rolle.
Die Quellen für meine Aussagen, Fragen und Vermutungen bilden die Bücher:
Zunächst einmal einige Definitionen zu den o.g. Begriffen und mein Verständnis davon.
Operator-Priorität
- anhand der Operator-Priorität erkennt der Compiler die Abarbeitungs-Reihenfolge von (Teil-)Ausdrücken.
- Bsp.:
Assoziativität
- die Assoziativität bestimmt die Abarbeitungs-Reihenfolge von (Teil-)Ausdrücken bei Verwendung von Operatoren gleicher Priorität
- es gibt die beiden Abarbeitungs-Reihenfolgen:
Auswertungs-Reihenfolge von Operanden
- in Java ist sie immer links -> rechts
- Bsp.: a + b * c + d
- hier werden in Java die Werte der Operanden a,b,c,d in genau derselben Reihenfolge ausgewertet
- bei dem betrachteten Beispiel ist meine Ansicht noch recht egal, es sich bei den 4 Operanden um unterschiedliche Variablen handelt. interessant wird es bei Beispielen, in denen dieselbe Variable mehrfach in einem Ausdruck verwendet wird
Frage 3:
Laut Java-Buch wird zunächst (x=2) bewertet und dann (x=x-1) nach der Regel ("die Operanden-Auswertung geschieht in Java von links -> rechts).
Wie ist es aber in C?
Und vor allem würde ich selbst in diesem Beispiel nicht die "links -> rechts Regel" als Grund für diese Abarbeitungs-Reihenfolgein Java heranziehen, sondern die Priorität/Assoziativität der Operatoren.
Folglich würde (x=2) zuerst bewertet und dann (x=x-1), weil zwei mal der Operator "()" verwendet wird, bei dem die Assiziativität links -> rechts gilt
ich habe viele fragen, die ich loswerden will und hoffe ihr könnt mir dabei helfen. so ... nun auf zum ersten Problem
=====================================================================
In diesen Betrachtungen spielen Operator-Prioritäten, die Assoziativität und die Auswertungs-Reihenfolge von Operanden eine Rolle.
Die Quellen für meine Aussagen, Fragen und Vermutungen bilden die Bücher:
- "Java als erste Programmiersprache"
- "C - Das Grundlagenbuch"
Zunächst einmal einige Definitionen zu den o.g. Begriffen und mein Verständnis davon.
Operator-Priorität
- anhand der Operator-Priorität erkennt der Compiler die Abarbeitungs-Reihenfolge von (Teil-)Ausdrücken.
- Bsp.:
Code:
int a=1;
int b=2;
int c=3
int d=4;
a + b * c + d
Die Abarbeitungs-Reihenfolge des Codes ist:
Vielmehr noch kommt auch ab Schritt (2) die Assoziativität ins Spiel, da 2 Mal der "+" verwendet wird, wobei hier eine Abarbeitung von links -> rechts geschieht.
- b*c (=6)
- a+6 (=7)
- 7+d (=11)
Vielmehr noch kommt auch ab Schritt (2) die Assoziativität ins Spiel, da 2 Mal der "+" verwendet wird, wobei hier eine Abarbeitung von links -> rechts geschieht.
Assoziativität
- die Assoziativität bestimmt die Abarbeitungs-Reihenfolge von (Teil-)Ausdrücken bei Verwendung von Operatoren gleicher Priorität
- es gibt die beiden Abarbeitungs-Reihenfolgen:
- von links nach rechts (links -> rechts)
- von rechts nach links (rechts -> links)
- Bsp.: siehe Operator-Priorität- von rechts nach links (rechts -> links)
Auswertungs-Reihenfolge von Operanden
- in Java ist sie immer links -> rechts
- Bsp.: a + b * c + d
- hier werden in Java die Werte der Operanden a,b,c,d in genau derselben Reihenfolge ausgewertet
Frage 1:
Wie ist die Operanden-Auswertungsreihenfolge in C?
Wie ist die Operanden-Auswertungsreihenfolge in C?
Frage 2:
Ich verstehe nicht ganz, weshalb zwischen der Reihenfolge der Abarbeitung von Operatoren und der Reihenfolge der Bewertung von Operanden unterschieden wird.
Ich stelle mir es so vor, dass die Operanden-Auswertung gleichzeitig mit der Feststellung der Operator-Reihenfolge, die ja die Abarbeitungs-Reihenfolge eines ganzen Ausdrucks bestimmt, geschieht. So würde im obigen Beispiel folgendes stattfinden:
(1) b*c // hierbei würden zunächst b und c als Operanden von "*" erkannt und ihre Werte festgestellt und dieser Teil-Ausdruck berechnet
(2) a+(b*c) // als nächsten würde die Assoziativiät entscheiden, welches "+" ausgeführt wird (hier gilt: links -> rechts), was bedeutet, dass der Wert von a als erster Operand erkannt wird und festzustellen ist; als zweiter Operand wird das Teil-Ergebnis (b*c) erkannt, welches zu diesem Zeitpunkt bereits bekannt ist
(3) (a+b*c)+d // Feststellung des ersten Operanden der zweiten Addition (a+b*c), welcher bereits bekannt ist und des zweiten Operanden (d)
Ich verstehe nicht ganz, weshalb zwischen der Reihenfolge der Abarbeitung von Operatoren und der Reihenfolge der Bewertung von Operanden unterschieden wird.
Ich stelle mir es so vor, dass die Operanden-Auswertung gleichzeitig mit der Feststellung der Operator-Reihenfolge, die ja die Abarbeitungs-Reihenfolge eines ganzen Ausdrucks bestimmt, geschieht. So würde im obigen Beispiel folgendes stattfinden:
(1) b*c // hierbei würden zunächst b und c als Operanden von "*" erkannt und ihre Werte festgestellt und dieser Teil-Ausdruck berechnet
(2) a+(b*c) // als nächsten würde die Assoziativiät entscheiden, welches "+" ausgeführt wird (hier gilt: links -> rechts), was bedeutet, dass der Wert von a als erster Operand erkannt wird und festzustellen ist; als zweiter Operand wird das Teil-Ergebnis (b*c) erkannt, welches zu diesem Zeitpunkt bereits bekannt ist
(3) (a+b*c)+d // Feststellung des ersten Operanden der zweiten Addition (a+b*c), welcher bereits bekannt ist und des zweiten Operanden (d)
- bei dem betrachteten Beispiel ist meine Ansicht noch recht egal, es sich bei den 4 Operanden um unterschiedliche Variablen handelt. interessant wird es bei Beispielen, in denen dieselbe Variable mehrfach in einem Ausdruck verwendet wird
Code:
int x=5, y=0;
y= (x=2) + (x = x-1);
Frage 3:
Laut Java-Buch wird zunächst (x=2) bewertet und dann (x=x-1) nach der Regel ("die Operanden-Auswertung geschieht in Java von links -> rechts).
Wie ist es aber in C?
Und vor allem würde ich selbst in diesem Beispiel nicht die "links -> rechts Regel" als Grund für diese Abarbeitungs-Reihenfolgein Java heranziehen, sondern die Priorität/Assoziativität der Operatoren.
Folglich würde (x=2) zuerst bewertet und dann (x=x-1), weil zwei mal der Operator "()" verwendet wird, bei dem die Assiziativität links -> rechts gilt
Zuletzt bearbeitet: