Hilfe bei return Beispiel
-
Hi,
ich verstehe das mit return überhaubt nicht.
In meinem Buch steht folgendes Beispiel:
#include <iostream> using namespace std; long quadrat (int zahl) { long quadr; quadr = zahl * zahl; return quadr; } int main() { int wert = 12; long ergebnis; ergebnis = quadrat(wert); cout << ergebnis << endl; }Was genau macht return denn nun? Wenn ich return dort weglasse ist die Ausgabe doch die gleiche = 144.
Was wird da wo zurückgegeben? Ich verstehe das einfach nicht.

Kann mir da jemand helfen?
-
zeroblack schrieb:
In meinem Buch steht folgendes Beispiel:
long quadrat (int zahl) { long quadr; quadr = zahl * zahl; return quadr; }lol? Steht das so? Dann wirf das Buch weg. Da ist so gut wie alles falsch. Das Ergebnis nach long zu casten verhindert aus verschiedenen Gründen keine Overflows.
-
zeroblack schrieb:
Was genau macht return denn nun? Wenn ich return dort weglasse ist die Ausgabe doch die gleiche = 144.
Das wäre großer Zufall das die Speicherzelle wiederverwendet wird, in der die Berechnung durchgeführt wurde. Das ist undefiniertes Verhalten. Return ist genau dafür da: einen Wert zurückzugeben.
Davon abgesehen sollte JEDER Compiler eine Fehlermeldung oder wenigstens eine Warnung geben, wenn du einerseits einen Typ für die Rückgabe, aber keinen Returnwert angibst. Wenn das nicht so ist, solltest du die Warnstufe erhöhen.
-
asc schrieb:
zeroblack schrieb:
Was genau macht return denn nun? Wenn ich return dort weglasse ist die Ausgabe doch die gleiche = 144.
Das wäre großer Zufall das die Speicherzelle wiederverwendet wird, in der die Berechnung durchgeführt wurde. Das ist undefiniertes Verhalten. Return ist genau dafür da: einen Wert zurückzugeben.
Davon abgesehen sollte JEDER Compiler eine Fehlermeldung oder wenigstens eine Warnung geben, wenn du einerseits einen Typ für die Rückgabe, aber keinen Returnwert angibst. Wenn das nicht so ist, solltest du die Warnstufe erhöhen.
Das Beispiel steht da genau so ja.
Also mein Compiler ist G++ sollte ich besser einen anderen verwenden?
Was heißt denn nun genau zurückgeben. Die Speicherzelle wird wieder entleert? Was genau meinst du mit Speicherzelle? Den Platz den der Wert im Arbeitspeicher bekommt?
Oder seh ich das jetzt alles falsch?

-
zeroblack schrieb:
Was heißt denn nun genau zurückgeben. Die Speicherzelle wird wieder entleert? Was genau meinst du mit Speicherzelle? Den Platz den der Wert im Arbeitspeicher bekommt?
Lass dich nicht durch das Meckern dieser Pseudopoprofis verwirren. Dem C++-Einsteiger können irgendwelche Speicherzellen und Best Practices erstmal komplett wumpe sein.
--------------------
Die Funktionlong quadrat(int zahl);gibt einen Wert vom Typ "long" zurück. Die ist halt so definiert (siehe das "long" am Anfang). Und siehe da: als letzte Anweisung findest du ein "return quadr;" in der Funktion. Dieses "quadr" ist einen lokale Variable vom typ "long", deren Inhalt die Funktion ausspuckt, wenn sie beendet wird.
Somit kannst du z.B. schreiben:
long q = quadrat(5);um das Quadrat von 5 zu berechnen.
Das ist das Selbe wie:long q = 5*5;Kapiert?
-
zeroblack schrieb:
Also mein Compiler ist G++ sollte ich besser einen anderen verwenden?
g++ ist schon in Ordnung aber wie gesagt die Warnstufe erhöhen, damit du eine Warnung bei fehlendem return kriegst. Das es ohne return funktioniert ist reiner Zufall und keinesfalls garantiert. Andere Compiler (Visual Studio) würden das nichtmal compilieren.
-
zeroblack schrieb:
Was genau meinst du mit Speicherzelle? Den Platz den der Wert im Arbeitspeicher bekommt?
Genau. Am einfachsten stellst du dir den Speicher wie ein Regal vor. Jede Variable belegt darin einen Platz (abhängig vom Datentyp mehr oder weniger). Nun ist es so, das wenn eine Variable nicht mehr benutzt wird, der Regalinhalt nicht automatisch entfernt wird (z.B. Das Ergebnis einer Berechnung). Eine weitere Variable könnte nun zufälligerweise den gleichen Platz einnehmen wie eine vorherige hatte.
zeroblack schrieb:
Was heißt denn nun genau zurückgeben.
Stell dir ein Programm wie ein Fabrik mit langen Flur vor, wobei jeder Arbeitsschritt (Funktion) in einem eigenen Zimmer von diesem abgeht. An jeder Türschwelle werden Eingangswerte (z.B. Holzbretter) hinein gegeben, und anschließend ein Ausgangswert zurückgegeben (z.B. einen neu erzeugten Stuhl; der Rückgabewert void heißt das du nur einen Händedruck bekommst, wenn die Aufgabe erledigt wurde).
Deine Funktion quadrat hat als Eingangswert eine Zahl, als Rückgabewert das Ergebnis einer Berechnung. Du kommst nur an die Berechnung wenn du auch an der Tür wartest, und den Wert entgegen nimmst.
War das Bildlich genug gesprochen?
-
Leprechaun schrieb:
Lass dich nicht durch das Meckern dieser Pseudopoprofis verwirren.
Ich weiß nicht warum du andere beleidigen musst, bist du mit einem falschen Fuß aufgestanden?
Ganz davon abgesehen, wirst auch du mit Sicherheit noch in die Situation kommen, das du unbewusst in deinen Fachbegriffen reden wirst. Das ist ganz normal, wenn es deine alltägliche "Umgebung" darstellt.
-
asc schrieb:
zeroblack schrieb:
Was genau meinst du mit Speicherzelle? Den Platz den der Wert im Arbeitspeicher bekommt?
Genau. Am einfachsten stellst du dir den Speicher wie ein Regal vor. Jede Variable belegt darin einen Platz (abhängig vom Datentyp mehr oder weniger). Nun ist es so, das wenn eine Variable nicht mehr benutzt wird, der Regalinhalt nicht automatisch entfernt wird (z.B. Das Ergebnis einer Berechnung). Eine weitere Variable könnte nun zufälligerweise den gleichen Platz einnehmen wie eine vorherige hatte.
zeroblack schrieb:
Was heißt denn nun genau zurückgeben.
Stell dir ein Programm wie ein Fabrik mit langen Flur vor, wobei jeder Arbeitsschritt (Funktion) in einem eigenen Zimmer von diesem abgeht. An jeder Türschwelle werden Eingangswerte (z.B. Holzbretter) hinein gegeben, und anschließend ein Ausgangswert zurückgegeben (z.B. einen neu erzeugten Stuhl; der Rückgabewert void heißt das du nur einen Händedruck bekommst, wenn die Aufgabe erledigt wurde).
Deine Funktion quadrat hat als Eingangswert eine Zahl, als Rückgabewert das Ergebnis einer Berechnung. Du kommst nur an die Berechnung wenn du auch an der Tür wartest, und den Wert entgegen nimmst.
War das Bildlich genug gesprochen?
Ok danke Leute jetzt verstehe ich das. Das Problem war nur das mein g++ compiler auch ohne return das Ergebnis ausgab. Das hat mich nun total verwirrt! Suggeriert das return überflüsslig ist. Vllt. behebt g++ das Problem von selbst??
Wie auch immer:
Wenn ich das jetzt also richtig sehe. Müsste es ohne return einen Error geben weil die Funktion zwar rechnet aber das Ergebniss nicht zurückgibt richtig? Und dadruch wird auch direkt der Platz im Arbeitspeicher wieder freigeben und man könnte den nächsten Wert berechenen.
-
zeroblack schrieb:
Vllt. behebt g++ das Problem von selbst??
Nein! Aber g++ -Wall sagt
warning: no return statement in function returning non-void [-Wreturn-type]
zeroblack schrieb:
Wenn ich das jetzt also richtig sehe. Müsste es ohne return einen Error geben weil die Funktion zwar rechnet aber das Ergebniss nicht zurückgibt richtig?
Nein, nur eine Warnung bei richtig gesetzten Compileroptione (siehe oben). Ansonsten ist das Verhalten undefiniert.
zeroblack schrieb:
Und dadruch wird auch direkt der Platz im Arbeitspeicher wieder freigeben und man könnte den nächsten Wert berechenen.
Nein, return gibt keinen Speicher frei. Darüber würde ich mir aber an deiner Stelle auch erst mal nicht den Kopf zerbrechen.
-
Zum undefinierten Verhalten:
Probier mal das, wenn du "Glück" hast, erhälst du 2 (statt 25) als Ergebnis.#include <iostream> int quadrat(int i) { int q = i * i; int dummy = i - 3; } int main() { std::cout << quadrat(5); // 2? }Auf meinem System (Linux, gcc) haut das jedenfalls hin.
So ists richtig (mal davon abgesehen, dass dummy nicht benötigt wird):
#include <iostream> int quadrat(int i) { int q = i * i; int dummy = i - 3; return q; } int main() { std::cout << quadrat(5); // 25! }
-
Hyde++ schrieb:
Zum undefinierten Verhalten:
Probier mal das, wenn du "Glück" hast, erhälst du 2 (statt 25) als Ergebnis.#include <iostream> int quadrat(int i) { int q = i * i; int dummy = i - 3; } int main() { std::cout << quadrat(5); // 2? }Auf meinem System (Linux, gcc) haut das jedenfalls hin.
So ists richtig (mal davon abgesehen, dass dummy nicht benötigt wird):
#include <iostream> int quadrat(int i) { int q = i * i; int dummy = i - 3; return q; } int main() { std::cout << quadrat(5); // 25! }Ja verstehe ich. Beim ersten bekomme ich ebenfalls 2 und beim zweiten 25.