Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
025
17.08.2002, 12:43
Onkel Dittmeyer



Du meinst wohl es entspricht nicht dem ISO-C++ Std =)

--


Dieser Beitrag wurde am 17.08.2002 um 16:50 von [dP]ThEpOpE bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
026
17.08.2002, 14:22
[PE]Spinator



ich seh das problem nicht...
wie kommst du darauf, das es nach diesem standard nicht definiert ist? steht das irgenwdo?
erst ++a, dann die additionsoperation, dann a++, fertig...

--

This post was written using Opera 7.0 (http://www.opera.com)

zum Seitenanfang zum Seitenende Profil || Suche
027
17.08.2002, 16:43
theDon



ja...aber es gibt compiler die das von rechts nach links auswerten...dann siehts anders auch :P

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
028
17.08.2002, 22:38
Andy_



Von dort nach dort ist dumm gesagt, eigentlich macht das ja kein Compiler.
Sondern ein C/C++ sowie PHP Compiler betrachtet jeden Operations-Vorschritt genau, und wertet aus, welcher davon die höhere Prorität hat.
Also nix da von links nach rechts oder andersrum. Bei sovielen schritten, die in der einen Rechnung drinne sind, ist es deutlich wie genau der Compiler dort arbeitet.

--

42 Es gibt keinen Sinn des Lebens.

zum Seitenanfang zum Seitenende Profil || Suche
029
17.08.2002, 23:42
theDon



ich geb zu der vergleich passt nicht gut...aber das ergebnis ist compiler-abhängig

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
030
18.08.2002, 04:19
Andy_



Das stimmt.

--

42 Es gibt keinen Sinn des Lebens.

zum Seitenanfang zum Seitenende Profil || Suche
031
18.08.2002, 11:24
[PE]Spinator



bei den ++/-- operatoren ist die auswertungsreihenfolge nicht relevant, da sie vor bzw. nach der eigentlichen operation ausgeführt werden...

--

This post was written using Opera 7.0 (http://www.opera.com)

zum Seitenanfang zum Seitenende Profil || Suche
032
18.08.2002, 13:27
Kriz



Falsch! Die Auswertungsreihenfolge ist nicht nur höchst relevant, sondern auch je nach Compiler extrem nichttrivial!

Als Beispiel folgender Ausdruck:

int a = 5, b = 6, erg = 0;
erg = a++ + ++b * ++b - a++;

Dieser Ausdruck scheint auf den ersten Blick mit gewissenhafter Abarbeitung von Priorität, Assoziativität und Rechenregeln einfach lösbar zu sein:

erg = 5++ + ++6 * ++b - a++; // Prioritätenabarbeitung
a = 6, b = 7

erg = 5 + 7 * ++7 - 6++;
a = 7, b = 8;

erg = 5 + 7 * 8 - 6; // Punkt vor Strich
erg = 5 + 56 - 6; // Links nach rechts
erg = 61 - 6;
erg = 55;

Dieses Ergebnis ist falsch! Das korrekte Ergebnis ist 64, weil der Compiler, BEVOR er überhaupt die Rechenregeln anwendet alle (!) Variablenwerte auf den Wert setzt, der ZULETZT errechnet worden ist. Im Klartext:

erg = 5++ + ++6 * ++6 - 5++; // Ein einziger Durchlauf für alle Variablen
erg = 5 + 7 * ++b - a++;
erg = ?a + ?b * 8 - 6;
erg = 6 + 8 * 8 - 6;
erg = 6 + 64 - 6;
erg = 64

Dieses Ergebnis kommt beim VC++ Compiler raus. Auch beim GNU Compiler kommt 64 raus. Diese Erkenntnis habe ich ehrlicherweise nicht gewußt, sondern durch Debuggersitzungen Schritt für Schritt zurückverfolgt.

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
033
18.08.2002, 20:31
[PE]Spinator



Ich bekomme trotz meiner sicht der Dinge auch das richtige resultat:

int a = 5, b = 6, erg = 0;
erg = a++ + ++b * ++b - a++;
//2 mal preinkrement von b, b = 8
erg = a++ + b * b - a++;
//b * b = 64 (punkt vor strich)
erg = a++ + 64 - a++;
// a++ - a++ = 0
erg = 64;
//anschliessend 2 mal postinkrement von a
//--> erg = 64, a = 7, b = 8

Das ganze kann man auch so schreiben:
erg = a + ( b += 1 ) * ( b += 1 ) - a;
a += 2;

das ist jetzt fast wie deine 2. herleitung, und wie man sieht ist die auswertungsreihenvolge bei ++/-- tatsächlich nicht relevant, da jedesmal alle variablen vor/nach einer operation (also einer befehlszeile) in/dekrementiert werden, es wird nicht erst das b links/rechts inkrementiert, dann gerechnet, und anschliessend das andere...

Könntest du mal deine herleitung erläutern?
wie kommst du von
erg = 5++ + ++6 * ++6 - 5++; // Ein einziger Durchlauf für alle Variablen
auf
erg = 5 + 7 * ++b - a++;
erg = ?a + ?b * 8 - 6;

wieso 6? a müsste ja 7 sein am schluss...

--

This post was written using Opera 7.0 (http://www.opera.com)

zum Seitenanfang zum Seitenende Profil || Suche
034
18.08.2002, 23:18
Kriz



Ja, ist auch 7, sorry =)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche