PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c++ mad



Kratz00
02-04-2003, 20:27
scheiß betreff, ich weiß aber was besseres viel mir nicht ein :)
unteres kleines c++ prog soll ein bsp für zeiger, referenzen sein
theoretisch sollte es 5 und 8 ausgeben
komischer weiße gibt es wenn die ausgabe in einer zeile erfolgt
erst 8 und dann 5 aus
wenn man es so macht
std::cout << plus(&x, y) << std::endl;
std::cout << << plusplus (x, y) << std::endl;
dann kommt wirklich erst 5 und dann 8

auf meine system gcc 3.2.1 krieg ich erst 8 und 5
auf ner solaris kiste mit gcc 2.95.2 erhalte ich das erwartete ergebnis
wo liegt der (denk)fehler ?

#include <iostream>

int plus (int *a, int b)
{
return *a = *a + b; //a==5 sowie x == 5, a referenz auf x
}

int plusplus (int &a, int b)
{
return a = a + b; //a==8 sowie x == 8, a referenz auf x
}

int main ()
{
int x=2, y=3;
std::cout << plus(&x, y) << " " << plusplus (x, y) << std::endl;
return 0;
}

anda_skoa
03-04-2003, 16:00
Das ist ein gutes Beispiel dafür, dass man Befehle mit Seiteneffekten nur einzeln benutzen sollte, oder zumindest nicht zusammen, wenn sie die selben Variablen benutzen/ändern.

Die Auswertnugsreihenfolge ist nämlich dem Compiler überlassen.

Wenn du den Code so modifizierst, dass er in plus und plusplus Debugoutput ausgibt, wirst du sehen, dass bei dir zuerst plusplus ausgewertet wird, dann erst plus.



#include <iostream>

int plus (int *a, int b)
{
std::cerr << "plus: " << *a << std::endl;
return *a = *a + b; //a==5 sowie x == 5, a referenz auf x
}

int plusplus (int &a, int b)
{
std::cerr << "plusplus: " << a << std::endl;
return a = a + b; //a==8 sowie x == 8, a referenz auf x
}

int main ()
{
int x=2, y=3;
std::cout << plus(&x, y) << " " << plusplus (x, y) << std::endl;
return 0;
}


(Code tags sind cool, solltest du auch mal versuchen :) )

Ciao,
_

Kratz00
03-04-2003, 19:44
das mit der auswertung hab ich mir schon gedacht aber warum das so ist war mir nicht klar.



#!/bin/sh
echo "das mit dem code tag muss einem doch gesagt werden ;')"