variable x++ problem

mike4004

Erfahrenes Mitglied
hi

Ich habe ein problem unzwar geht es um Folgentes beispiel.

wenn ich per hand rechen was für die Variable herauskommt komme ich auf -4 der compieler gibt aber -5 aus woran liegt das?



C:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int x=3,y=5, z=7 ,a;
    a=(--x) * (x++) - (y--) * (--y) + (z++);
  printf("%i", a);
  system("PAUSE");	
  return 0;
}

mfg mike4004
 
mike4004 hat gesagt.:
int x=3,y=5, z=7 ,a;
a=(--x) * (x++) - (y--) * (--y) + (z++);


also

es passiert folgendes

zuerst die --x, --y => x = 2 & y = 4

a = 2 * 2 - 4 * 4 + 7
a = 4 - 16 + 7
a = -5

und danach wird x++, y++ u. z++ gerechnet -> x = 3, y = 5, z = 8

Dein Fehler war mit
a = 2 * 3 - 4 * 5 + 7
zu rechnen, is mir auch passiert
 
Hi

danke für eure hilfe und die lösung der Problems allerdings war in diesem Fall meine Hand schult den auf meinem Zettel stand a=(--x) * (x++) - (--y) * (y--) + (z++);

also das 1 y, --y und das 2 y, y-- deshalb bin ich auf -4 gekommen.

mfg mike4004
 
Ähhh wo zum Teufel lernt man so etwas? Das Verhalten ist wie oben beschrieben ist UNDEFINIERT. Du darfst eine Variable innerhalb einer Anweisung nur einmal verändern. Das machst du aber sowohl mit x als auch mit y zwei Mal.
Wenn ihr das in der Schule so macht würd ich mal den Lehrer darauf hinweisen.

Z.B.
y = y++; -> Undefiniert!
y = y + 1; -> Ok!

Anm: Das mit "innerhalb einer Anweisung" ist im Grunde nicht ganz korrekt. Für einen Anfänger reicht das aber. Siehe Standard / Link von oben.

Gruß
 
Hi


wir haben das in der Schule nur gemacht um Prefix und Postfix besser zu verstehen und das nur am Zettel!

Frage wieso ist das falsch die Rechnung der Compieler machts ja?

mfg mike4004
 
Nun komm ich mir verarscht vor... Habs oben doch schon 2x geschrieben:

Innerhalb einer Anweisung darf man jede Variable nur einmal verändern!

y = 0;
y = y++;

Was kommt raus - 0 oder 1? Siehst du die Problematik? Es ist undefiniert, das heißt der Compiler kann machen was er will.

Gruß
 
Hi

aha deshalb meintest du es könnte auch 43 rauskommen.

allerdings verstehe ich noch immer net wieso das net gehen soll erklärs mal für beginner ;-).

mfg mike4004
 
mike4004 hat gesagt.:
allerdings verstehe ich noch immer net wieso das net gehen soll erklärs mal für beginner ;-).
Es ist einfach nicht definiert, was bei einem solchen Konstrukt geschehen soll. Das tatsächliche Verhalten kann daher von Compiler zu Compiler unterschiedlich sein.
 
Zurück