Das heißt doch, dass VS von rechts nach links arbeitet, denn:
#include
void main() {
int x = 10;
int y = 20;
int z = 30;
x = y = z = 40;
cout
gibt aus: 40 40 40
Jetzt hat mir mein Programmieren-Lehrer in der Berufschule gesagt, dass könne nicht so sein (dass cout von rechts nach links arbeitet), weil z.B. cout zuerst den Teilausdruck cout bearbeitet, dann cout zurückliefert und somit danach den Teilausdruck cout verarbeitet. Er meint dies, weil ja der Teilausdruck "Hallo " keinen Sinn ergeben würde.
Kann hier jemand Licht ins Dunkel bringen, ich versteh das alles nicht so ganz!?_
Das kann durchaus sein, das der VC++ die Ausdrücke von rechts nach links verarbeitet. Er wird zuerst die Terme bestimmen, also vrnl zuerst x, dann (x=y=z=40) dann z, y und x. Anschließend übergibt er das ganze in der normalen Reihenfolge an cout, so dass es korrekt auf dem Bildschirm ausgegeben wird.
Das kann durchaus sein, das der VC++ die Ausdrücke von rechts
nach links verarbeitet. Er wird zuerst die Terme bestimmen,
also vrnl zuerst x, dann (x=y=z=40) dann z, y und x.
Anschließend übergibt er das ganze in der normalen Reihenfolge
an cout, so dass es korrekt auf dem Bildschirm ausgegeben
wird.
Jawoll, so wird’s gemacht. Ich hab herausgefunden, dass eigentlich sowas herauskommt: operator
Also ist es dem Compiler überlassen, in welcher Reihenfolge er dies abarbeitet, weil es kein Standard ist.
Die Seite enthält eine Tabelle mit allen C+±Operatoren nach Prioritäten geordnet. Weiterhin wird die Assoziativität der Operatoren als Suffix angegeben. Für operator
#include
using namespace std;
int main() {
int x = 10;
int y = 20;
int z = 30;
operator
Dabei war mir eigentlich klar, dass das ganze auch von rechts nach links abgearbeitet werden kann. Oder sehe ich da irgendwas falsch?
Eine kleine Bem. zum include: Diese include-Anweisung ist die richtige. #include (ohne std) bindet die ‚alte‘ iostream-Lib ein. Es sollten aber besser wie hier die neuen benutzt werden. Vor allem darf man die alten und neunen iostream-Libs auf keinen Fall mischen.
1.Quellcode:
int main() {
int x = 10;
int y = 20;
int z = 30;
operator
Der o.a. Code ist lediglich die Auflösung des Ausdrucks
2.Quellcode:
cout
Der Compiler genriert also die in 1.) angegebenen Methoden-Aufrufe. Und daraus wird ja ersichtlich das der Ausdruck unter 2.) von links nach rechts augelöst wird. Denn, der innerste Aufruf wird ja zuerst ausgeführt und das ist
cout.operator(x)
Dann wird der globale operator operator
operator
[...] soll dabei bedeuten, das der Ausdruck schon augewertet wurde. Und alle stream-operatoren
operator
ausgeführt, also erst dann sollte die Zuweisung auf x,y,z stattfinden.
Wenn Du das Progamm mal debugst, wirst Du aber feststellenm, dass sich die Variale x beim ersten Aufrunf des innersten Ausdrucks schon geändert hat. Das ist schlichtweg _falsch_. Ein weiterer Hinweis darauf, dass der Audruck nicht richtig ausgeführt wird ist, dass die Debug-exe ein anderes Ergebnis liefert als die Release-exe. Die Debug-exe gibt
40 40 40 10
auf die Konsole aus. Die Release-exe aber
40 40 40 40
Das Problem wird der optimierende Compiler von MS sein. Er merkt nicht dass der Ausdruck (x=y=z=40) einen Seiteneffekt auf die vorherigen Aufrufe von operator