data-bear Geschrieben 3. Januar 2002 Geschrieben 3. Januar 2002 Kann mir jemand erklären wieso bei folgendem C-Code, der Wert 40 ausgegeben wird? Ich komme nie auf diesen Wert: int a=12; a+=++a+a++; printf("%i\n",a); Gruss data-bear Zitieren
Klotzkopp Geschrieben 3. Januar 2002 Geschrieben 3. Januar 2002 Also, als erstes wird der Prä-Inkrementoperator ausgewertet, damit ist a 13. Dazu wird a++ addiert, der Post-Inkrementoperator macht a zu 14, gibt aber 13 zurück. Danach wird zu a (jetzt 14) das Ergebnis der Addition (26) addiert, und wir sind bei 40. Wer denkt sich denn so was aus? Zitieren
Crush Geschrieben 7. Januar 2002 Geschrieben 7. Januar 2002 Sowas ist doch vollkommener Blödsinn! Zitieren
Klotzkopp Geschrieben 7. Januar 2002 Geschrieben 7. Januar 2002 Kannst Du laut sagen. Ich tippe auf eine Übungsaufgabe oder auf eine Demonstration, was für schrecklichen Code man mit C produzieren kann Zitieren
Crush Geschrieben 7. Januar 2002 Geschrieben 7. Januar 2002 Damit wollen die doch nur alle blöd im Kopf machen und sich selber hinstellen als ob sie die Meister wären, obwohl sowas kein normaler Mensch im echten Leben braucht. Und wenn man dann den Lehrer frägt, wo der Unterschied zwischen NOT und EOR -1 ist, dann raufen die sich die Haare und rechnen stundenlang an der Tafel mit Wahrheitstabellen rum bis sie kapitulieren (so war´s jedenfalls mal bei mir, weil ich surfen wollte und der Lehrer auch dabei seinen Spaß hatte). Nach der Ausbildung kratzt man sich dann am Kopf und überlegt, warum man denn nix gelernt hat! Zitieren
gajUli Geschrieben 7. Januar 2002 Geschrieben 7. Januar 2002 Komisch, wie kurz doch der Weg ist von einem zwar nicht direkt praxisrelevanten, aber lehrreichen Beispiel (was lehrreich ist, ist niemals irrelevant) hin zur Lehrerschelte. Uli Zitieren
Stefan Geschrieben 9. Januar 2002 Geschrieben 9. Januar 2002 ... was eure Antworten angeht, denn: Auszug aus C-FAQ: Frage 4.2: Bei meinem Compiler liefert int i = 7; printf("%d\n", i++ * i++); 49. Sollte das Ergebnis nicht 56 lauten, egal in welcher Reihenfolge die Terme ausgewertet werden? Antwort: Die Postinkrement und -dekrement Operatoren ++ und -- führen ihren Seiteneffekt erst aus, nachdem sie den vorherigen Wert ausgegeben haben. Das "nachdem" in dieser Aussage wird dabei aber oft mißverstanden: Der Seiteneffekt muß sich nicht sofort auswirken, nachdem der ursprüngliche Wert der Variablen ausgegeben wurde; er kann sich erst auswirken, nachdem andere Teilausdrücke bearbeitet wurden. Das einzige, auf das man sich verlassen kann, ist, daß alle Seiteneffekte berücksichtigt wurden, nachdem der Ausdruck "vollständig" berechnet wurde (vor dem nächsten "sequence point" in ANSI C Terminologie). Im obigen Beispiel kann der Compiler zuerst die beiden ursprünglichen Werte miteinander multiplizieren und danach alle Seiteneffekte berücksichtigen. *************************** Der springende Punkt scheint der zu sein, das alle Seiteneffekte _sicher_ berücksichtig sind, nachdem der _gesamte_ Ausdruck berechnet wurde... Danach könnte dann auch 36 herauskommen, wenn das Inkrement/Dekrement erst nach dem gesamten Ausdruck ausgeführt/berücksichtigt werden werden. Tschau, Stefan. Zitieren
Stefan Geschrieben 9. Januar 2002 Geschrieben 9. Januar 2002 Voriges Posting von mir ist nicht 100% korrekt, habe mittlerweile aber die URL zur C-FAQ: http://www-info2.informatik.uni-wuerzburg.de/dclc-faq/ So, da ausserdem das Verhalten undefiniert ist, kann nicht nur 36 herauskommen, sondern auch 7464 oder 4353654 oder 0. Tschau, Stefan. Zitieren
Klotzkopp Geschrieben 9. Januar 2002 Geschrieben 9. Januar 2002 Also ich komme auf 39 als weiteres mögliches Ergebnis (von undefiniertem Verhalten mal abgesehen). Zitieren
Broadcast Geschrieben 9. Januar 2002 Geschrieben 9. Januar 2002 Also ich finde diese Art von Aufgaben wie von data-bear richtig gut. Kann man ein wenig drüber tüfteln ! Allerdings im Bezug auf posierenden alleskönnerische Dozenten würde mir das auch nicht so gut gefallen ! :cool: Gruß Zitieren
Crush Geschrieben 9. Januar 2002 Geschrieben 9. Januar 2002 Bei M$ werden nur die Variablen verwendet und das ++ wohl erst nach der Multiplikation rangehängt. Da das Ergebnis eh undefiniert ist, haben die sich wohl dafür entschieden. Das wird wohl jeder Compiler anders machen, vor allem wenn noch diverse Optimierungen mitspielen. Egal was ich mache bekomme ich immer 49. Die wollen damit den Leuten wohl klarmachen, daß der ++ nur zum Inkrementieren einer Variable oder eines Zeigers verwendet werden soll, ohne sich auf Terme auszuwirken in denen es verwendet wird. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.