Mathematische Berechnungen
-
johny_legend schrieb:
Du kannst mich aber gerne eines Besseren belehren und mir ein Beispiel zeigen, bei dem dieses Prinzip versagt.
Testcode:
#include <stdio.h> int func (int k, int i) { k *= i + k--; return k; } int main (void) { printf ("%d\n", func (4,3)); return 0; }
Testcompiler:
gcc version 3.4.5 (mingw special)
Test [1]
D:\temp>gcc ub.c -o ub -O0 D:\temp>ub 28
Test [2]
D:\temp>gcc ub.c -o ub -O1 D:\temp>ub 27
-
ändert sich was, wenn du
return k *= i + k--;
schreibst?
-
Dann ist das Ergebnis immer 28 :p
edit: read "immer" as "mit den Optimierungsstufen O0, O1, O2, O3, Os"
-
camper schrieb:
ändert sich was, wenn du
return k *= i + k--;
schreibst?
Dann müsste immer 28 rauskommen, weil nach return nicht mehr dekrementiert wird.
Bzw.: Schade. Und ich war mir so sicher.
-
johny_legend schrieb:
Ich sage nur, dass es absehbar ist, wie der Compiler den Ausdruck k*=i+k--; aufarbeitet, und zwar nach den Prioritäten:
Die Prioritäten haben nichts mit der Abarbeitungsreihenfolge zu tun. Das ist nur Syntax.
-
Hallo,
ich würde dann gern wissen,
wie k = 4; i = 3;
x = i + k--;
das ergebnis x = 7 sein kann;
Ich habs so berechnet. Erst addiert und dann -1 subtrahiert
i = 3 + 4-- <=> 6oder eigentlich müsste man 4 dekrementieren und dann addieren wegen der Priorität????
würde sowieso alles 6 ergeben ob vor oder danach......
bin mal gespannt.
Gruß
-
Postfix bedeutet ja, dass zuerst der aktuelle Wert zurückgegeben wird und erst danach wird inkrementiert/dektrementiert.
x = i + k--;
// erst wird der Wert 4 an k zurückgegeben, dann wird addiert und dann erst wird
// dekrementiert. x ist nach dieser Operation also 7 = 3(i) + 4(k).
// nach dieser Zeile ist k aber = 3
-
x = i + k--;
Der Wert des Teilausdrucks
k--
ist der Wert, den die Variable k vor dem Dekrementieren hat, also 4.
Der Wert des Teilausdrucks i ist der Zustand der Variablen i, also 3.
Der Wert des Ausdrucksi + k--
ist die Summe der beiden Operanden (=der Werte der entsprechenden Teilausdrücke), 3+4=7
Der Wert des Zuweisungsausdrucksx = i + k--;
ist der Wert des rechten Operanden, also 7.
Der Ausdruck hat 2 Seiteneffekte:
(1) der Wert der Variablen k wird durch den um 1 erniedrigten Wert, also 3, ersetzt.
(2) der Wert der Variablen x wird durch den Wert 7 ersetzt.
-
Hallo,
ich bin ein wenig neugierig oder vielleicht habe ich es hier überlesen, wer hat denn und wo eine solche Aufgabe mit diesen komischen Ausdrücken bekommen?
Die Aufgabe ist doch vollkommen von der Realität entfernt. Ich persönlich finde es falsch, viele Operationen in eine Zeile zu packen. Zunächst ein mal, es ist unleserlich, aber - zähneknirschen - ok. Was ich aber noch schlimmer finde ist, dass man mit dem Debugger im Code wenige Stellen hat, ein Breakpoint zu setzen...
-
camper schrieb:
Der Ausdruck hat 2 Seiteneffekte:
(1) der Wert der Variablen k wird durch den um 1 erniedrigten Wert, also 3, ersetzt.
(2) der Wert der Variablen x wird durch den Wert 7 ersetzt.was heisst hier 'seiteneffekte'. das ist ja wohl beabsichtigt, wenn man x=... und k-- da hinschreibt.
-
-fricky- schrieb:
camper schrieb:
Der Ausdruck hat 2 Seiteneffekte:
(1) der Wert der Variablen k wird durch den um 1 erniedrigten Wert, also 3, ersetzt.
(2) der Wert der Variablen x wird durch den Wert 7 ersetzt.was heisst hier 'seiteneffekte'. das ist ja wohl beabsichtigt, wenn man x=... und k-- da hinschreibt.
Und wer sagt, das Seiteneffekte zwangsläufig was unbeabsichtigtes sind?
-
Tachyon schrieb:
-fricky- schrieb:
camper schrieb:
Der Ausdruck hat 2 Seiteneffekte:
(1) der Wert der Variablen k wird durch den um 1 erniedrigten Wert, also 3, ersetzt.
(2) der Wert der Variablen x wird durch den Wert 7 ersetzt.was heisst hier 'seiteneffekte'. das ist ja wohl beabsichtigt, wenn man x=... und k-- da hinschreibt.
Und wer sagt, das Seiteneffekte zwangsläufig was unbeabsichtigtes sind?
ok, da hast du auch wieder recht. aber wenn bei x = i + k--; das x= und das k-- seiteneffekte sind, was ist dann der 'haupteffekt'?
-
-fricky- schrieb:
ok, da hast du auch wieder recht. aber wenn bei x = i + k--; das x= und das k-- seiteneffekte sind, was ist dann der 'haupteffekt'?
-
-fricky- schrieb:
Tachyon schrieb:
Und wer sagt, das Seiteneffekte zwangsläufig was unbeabsichtigtes sind?
ok, da hast du auch wieder recht. aber wenn bei x = i + k--; das x= und das k-- seiteneffekte sind, was ist dann der 'haupteffekt'?
Ausdrücke haben Eingaben, Ausgaben und Seiteneffekte. Die Eingabe von k-- ist k, die Ausgabe k. Der Seiteneffekt ist, dass k seinen Wert verändert.
-
LordJaxom schrieb:
-fricky- schrieb:
Tachyon schrieb:
Und wer sagt, das Seiteneffekte zwangsläufig was unbeabsichtigtes sind?
ok, da hast du auch wieder recht. aber wenn bei x = i + k--; das x= und das k-- seiteneffekte sind, was ist dann der 'haupteffekt'?
Ausdrücke haben Eingaben, Ausgaben und Seiteneffekte. Die Eingabe von k-- ist k, die Ausgabe k. Der Seiteneffekt ist, dass k seinen Wert verändert.
ach ja, das hat mich doch schon mal stutzen lassen. also mit diesem informatik-vokabular werde ich mich nie anfreunden können.
-
Ich hätte da mal eine Frage. Warum schreibt man das Ganze nicht in Form:
k *= i + k; k--;
Dann ist es erstens eindeutig was gemeint ist und man hat keine Probleme diese Code-Zeilen zu verstehen wenn man einen Monat später nocheinmal draufblickt.
-
Macht man doch. Anfänger sparen sich halt gerne ein paar Statements oder temporäre Variablen weil der Code dann "optimierter" aussieht
-
Bitte ein Bit schrieb:
Ich hätte da mal eine Frage. Warum schreibt man das Ganze nicht in Form:
k *= i + k; k--;
Dann ist es erstens eindeutig was gemeint ist und man hat keine Probleme diese Code-Zeilen zu verstehen wenn man einen Monat später nocheinmal draufblickt.
Es ist wohl offensichtlich, daß besagter Code nicht dazu da ist etwas sinnvolles zu machen, sondern als Lehr/Lern-Beispiel dient. Ich denke nicht, daß ein Programmierer absichtlich solchen oder ähnlichen Code in seinem Programm verwenden würde. Also wenn ich nach einiger Zeit einen Blick in meinem Quellcode werfe, will ich nicht erst groß nachdenken müssen was für schlaue Gedanken ich mir bei der Programmierung gemacht habe, sondern will beim lesen/überfliegen der Codezeilen sofort die Funktion erkennen, aber gut das macht halt jeder wie er will.