funktion rückgabe
-
hallo
ich lese gerade das taschenbuch von dirk louis (markt und technik)
c++ leicht, klar, sofort
ich bin bei funktionen angekommen. meine frage ist warum ich bei funktionen einen rückgabewert angeben muß. es gibt ja auch funktionen wievoid func();
was macht es für einen sinn hier int, double oder sonst was anzugeben?
ich weiß das void auch ein rückgabewert ist.
die eigentlichen datentypen die ja verarbeitet werden, sind ja im parameter angegeben. wenn ich also den wert an den aufrufer zurückgebe sollte es doch egal sein was für einen rückgabewert die funktion hat.
vielleicht kann mich einer aufklären.das taschenbuch ist eigentlich nicht schlecht, aber es werden "innere" dinge nicht erklärt, nur das wie aber nicht das warum. als einsteiger vielleicht nicht schlecht aber wissen würde ich doch schon so einige dinge gern.
danke
-
void ist eigentlich kein Rückgabeparameter. Es signalisiert nur, dass es keinen Rückgabewert gibt.
die eigentlichen datentypen die ja verarbeitet werden, sind ja im parameter angegeben. wenn ich also den wert an den aufrufer zurückgebe sollte es doch egal sein was für einen rückgabewert die funktion hat.
Da hast du dir deine Frage ja schon selbst beantwortet: Es macht eben oft Sinn, dem Aufrufer das Ergebnis der Funktion per Rückgabewert zurückgeben zu lassen.
Paradebeispiel:int add(int a, int b) { return a+b; }
Dadurch, dass die Funktion das Ergebnis als Rückgabewert liefert, lässt sie sich intuitiver bedienen und die Funktion selbst ist quasi ein Ausdruck, was sowas ermöglich:
// Das hier würde alles bei void nicht gehen: int c = add(2,3); int d = add(4, add(6,7)); cout << add(6,8);
-
es ist einfach so, dass der eingabewert nicht immer gleich dem ausgabewert ist:
int StringToInt(string a); int main(){ string b("25"); cout<<5+StringToInt(b);//ergebnis 30 return 0; }
die funktion macht aus eienr zeichenkette(in dem beispiel "25") eine zahl mit der man rechnen kann
-
aha, auch wenn das beispiel mit dem string nicht funktioniert
[Linker error] undefined reference to `stringtoint(std::string)' // ich weiss noch nicht welche header ich dafür einbinden muss. // #include<string> oder <sstream> oder <cstring> ist es nicht, nun denn
glaube ich es dennoch verstanden zu haben.
wenn ich als rückgabetyp der funktion int verwende dann wird dieser auch immer als int zurückgegeben, egal welche parameterdatentypen ich verwende und egal wie der datentyp des gesamtausdrucks (aus der funktion) ist.
wenn ich aber void als rückgabetyp verwende dann wird der datentyp der rückgabe vom wert des ausdrucks (in der funktion) benutzt.
ist das so richtig verstanden und ausgedrückt?
das hilft mir dann zumindest mal weiter um zu verstehen warum .........
-
unregistred schrieb:
aha, auch wenn das beispiel mit dem string nicht funktioniert
[Linker error] ...
Das ist keine Standardfunktion, sondern nur ein Beispiel. otze hatte halt keine Lust, sich eben die Funktion ausm Ärmel zu schütteln und deshalb nur den Prototyp angegeben.
unregistred schrieb:
wenn ich als rückgabetyp der funktion int verwende dann wird dieser auch immer als int zurückgegeben, egal welche parameterdatentypen ich verwende
Richtig, wäre auch anstrengend, wenn sich der Rückgabetyp einfach mal ändern könnte...
unregistred schrieb:
... und egal wie der datentyp des gesamtausdrucks (aus der funktion) ist.
wenn ich aber void als rückgabetyp verwende dann wird der datentyp der rückgabe vom wert des ausdrucks (in der funktion) benutzt.
Ab hier kapier ich nicht mehr, was du meinst.
void heißt einfach "Funktion gibt nix zurück". Soll eine Funktion aber was zurückgeben, gibste halt den entsprechenden Typ an - egal, ob int, float oder selbstdefinierte Typen oder Zeiger darauf...edit
Nach nochmaligem Lesen hab ich's, glaub ich.
Also, wenn du z.B. int als Rückgabetyp wählst, in der Funktion aber versuchst, deinem return einen float mitzugeben, wird dein Compiler meckern. Ich denk mal, das meintest du mit "datentyp des gesamtausdrucks"...
-
void heißt einfach: Die Funktion gibt nichts zurück. Nicht mehr und nicht weniger.
-
Also, wenn du z.B. int als Rückgabetyp wählst, in der Funktion aber versuchst, deinem return einen float mitzugeben, wird dein Compiler meckern. Ich denk mal, das meintest du mit "datentyp des gesamtausdrucks"...
ja so meinte ich es auch
schlecht ausgedrückt. man müsste den float in dem fall umwandeln damit der compiler nicht meckert.void gibt nichts zurück. da hatte ich halt meine probleme mit, warum gibt der nichts zurück wenn der wert aber doch an den aufrufer zurückgegeben wird. ich habe hier nicht unterschieden zwischen rückgabetyp der funktion und dem rückgabetyp des wertes des ausdrucks in der funktion.
ich dussel dachte wenn die funktion mit void nichts zurückgibt wie kommt dann der wert an den aufrufer zurück *gg* und somit den sinn der funktion in frage gestellt.
jetzt habe ich es aber.ich bedanke mich
-
gugg dir mal dieses beispiel an:
#include <iostream> #include <string> using namespace std; void GibAus(string Ausgabe) { cout << Ausgabe << endl; } int main() { string bla = "Hallo"; GibAus(bla); }
Hier wäre es unsinnig, wenn GibAus() einen Wert zurückliefern soll, weil es nur Aktionen ausführt und keinen Wert bearbeitet und dann an die main-Funktion zur weiteren Verwendung zurückgibt.
Der Rückgabewert einer Funktion ermöglicht dir also direkte Zuweisungen:// ... int summe = Addiere(a,b); // ...
Bildlich kannst du dir also vorstellen, dass an der Stelle, wo du eine Funktion aufrufst, die einen Wert zurückgibt, dieser zurückgegebene Wert "eingesetzt" wird. Oben stände dann zum Beispiel (wenn a = 5 und b = 6 ist):
//... int summe = 11; // ...
MFG
ChrisEDIT: Funktionen ohne Rückgabewert werden übrigens auch Prozeduren genannt. Vielleicht sagt dir das mehr.
-
Zyrian schrieb:
EDIT: Funktionen ohne Rückgabewert werden übrigens auch Prozeduren genannt. Vielleicht sagt dir das mehr.
Ist das allgemeingültig? Kenn ich nur aus Pascal.
-
es gibt keine prozeduren in c++
-
otze schrieb:
es gibt keine prozeduren in c++
ok
Prozedur kann man halt imho als Synonym für eine Funktion ohne Rückgabe bezeichnen. Ich wollte halt nur ein Wort in die Runde werfen, was einem vielleicht mit der Vorstellung einer Funktion ohne Rückgabewert etwas unter die Arme greift
-
wenn du jetzt noch mit records anfängst, schlag ich dich
-
nooin
*duck*
öhh, was sind records? waren das net structs in Pascal? ich glaub, das aufgeschnappt zu haben, als mein infolehrer mal über diese "tolle" sprache philosophierte.
C.
-
jo, wo wir grad bei bildlichen ausdrückenw aren, wollte ich verhindern, dass du den auch noch dazu nimmst^^
-
naja, damit würd ich ja alles ins lächerliche ziehen