Probleme mit cout

Hi,

ich hab ein Problem mit der Ausgabe über cout.

Wenn ich folgendes Programm mit VisualC++ 6.0 starte:

_#include

void main() {
int x = 10;
int y = 20;
int z = 30;

cout
sieht die Ausgabe folgendermaßen aus: 40 40 40 40 10

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!?_

Hallo Stefan,

ich vermute mal (so auf den ersten Blick) das hängt eher mit der Rangfolge der Operatoren zusammen, da der Operator

ich vermute mal (so auf den ersten Blick) das hängt eher mit
der Rangfolge der Operatoren zusammen, da der Operator
x=y=z=40 ein

Hi,

ich hab ein Problem mit der Ausgabe über cout.

Wenn ich folgendes Programm mit VisualC++ 6.0 starte:

_#include

void main() {
int x = 10;
int y = 20;
int z = 30;

cout
sieht die Ausgabe folgendermaßen aus: 40 40 40 40 10_

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.

grüße

Kann doch nicht sein!

Du hast Recht, da war ich auf dem Holzweg. Es liegt tatsächlich an der Optimierung innerhalb des Compilers.

Lass das Programm mal im Release-Mode laufen, dann bekommst du als Ergebnis „40 40 40 40 40“ ausgegeben.

ich würde so eine Konstruktion sowieso nicht benutzen. Besser (und auch besser lesbar wäre dann:

void main() {
int x;
int y;
int z;
x = y = z = 40;

cout 

Das läuft dann immer wie erwartet und man kann den Code auch auf 
Anhieb verstehen.

Gruß
Marian

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.

Hi,

schau mal hier

http://www-agrw.informatik.uni-kl.de/~jmayer/c-opera…

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

Ich hab von jemandem anderen das hier bekommen:

#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?

Hi Stefan,

Ich hab von jemandem anderen das hier bekommen:

#include
using namespace std;

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