Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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?

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!

... 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.

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.

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ß

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.