Ausgeben oder zurückgeben?
Anfänger verwechseln oft return und std::cout, weil beide einen Wert herauszugeben scheinen. Sie tun aber sehr verschiedene Dinge:
std::coutzeigt dir einen Wert nur an, in der Ausgabe. Das Programm kann mit dem Ausgegebenen nicht arbeiten.returngibt den Wert an das Programm, das ihn in einer Variablen speichern, mit ihm rechnen oder ihn ausgeben kann.
Sieh dir an, was passiert, wenn eine Funktion ihr Ergebnis ausgibt, statt es zurückzugeben, und das Programm dann damit rechnen will:
#include <iostream>
void gibSummeAus(int a, int b) {
std::cout << a + b << std::endl;
}
int main() {
int ergebnis = gibSummeAus(2, 3);
std::cout << ergebnis * 2 << std::endl;
return 0;
}Das Programm lässt sich nicht kompilieren:
main.cpp:8:9: error: cannot initialize a variable of type 'int' with an rvalue of type 'void'
8 | int ergebnis = gibSummeAus(2, 3);
| ^ ~~~~~~~~~~~~~~~~~
1 error generated.Die Fehlermeldung sagt, dass eine Variable vom Typ int nicht mit einem Wert vom Typ void gefüllt werden kann. Die Funktion gibSummeAus ist void, sie gibt also nichts zurück, was sich speichern ließe. Sie würde nur die Zahl 5 ausgeben. gibSummeAus(2, 3) * 2 endet genauso, nur mit dem Fehler invalid operands to binary expression ('void' and 'int'): Mit „nichts“ kann man nicht rechnen.
Die Lösung ist, void in int zu ändern und den Wert zurückzugeben, statt ihn auszugeben: return a + b;.
Es kann auch andersherum passieren: Eine Funktion gibt einen Wert zurück, aber niemand verwendet ihn. Schreibst du in main nur addiere(2, 3);, gibt das Programm nichts aus. Die Funktion hat 5 zurückgegeben, aber das Programm hat den Wert weder gespeichert noch ausgegeben, er ging also verloren. Willst du ihn sehen, gib ihn aus: std::cout << addiere(2, 3) << std::endl;.
Wann sollte eine Funktion also ausgeben, und wann zurückgeben? Eine Funktion, die etwas berechnet, sollte das Ergebnis zurückgeben. Der Code, der sie aufruft, entscheidet dann, was er damit macht: es ausgeben, speichern oder weiter damit rechnen. Gib innerhalb einer Funktion nur dann aus, wenn das Ausgeben ihre ganze Aufgabe ist, wie bei sageHallo() oder gibFlaecheAus().
Du kannst auch Text zurückgeben. Eine Funktion, die einen Text mit einer Zahl darin zusammenstellt, kann ihn als std::string zurückgeben, und das Programm gibt ihn dann aus, wo es will. Aber eine Zahl lässt sich nicht mit + an einen Text hängen. Wandle sie zuerst mit der Funktion std::to_string() in Text um:
#include <iostream>
#include <string>
std::string formatierePreis(int preis) {
return std::to_string(preis) + " EUR";
}
int main() {
std::string text = formatierePreis(120);
std::cout << "Preis: " << text << std::endl;
std::cout << "Mit Rabatt: " << formatierePreis(120 - 20) << std::endl;
return 0;
}Dieses Programm gibt aus:
Preis: 120 EUR
Mit Rabatt: 100 EURstd::to_string(120) gibt den Text "120" zurück, und + hängt " EUR" an. Würdest du nur return preis + " EUR"; schreiben, ließe sich das Programm kompilieren, würde aber nicht funktionieren: Es würde Unsinn ausgeben oder mit einem Fehler abbrechen, weil C++ eine Zahl und einen Text in Anführungszeichen nicht mit + verbindet. Und Vorsicht bei Dezimalzahlen: std::to_string(2.5) gibt "2.500000" zurück, mit sechs Nachkommastellen.
So schreibst du es:
Anweisungen
- 1
Eine Pizza kostet 9 und ein Getränk 3. Die Funktion
bestellpreissoll den Preis einer Bestellung berechnen, gibt ihn aber nur aus, deshalb lässt sich das Programm nicht kompilieren. Ändere die Funktion so, dass sie den Preis zurückgibt, statt ihn auszugeben. Das Programm gibt dannZusammen: 63aus. - 2
Schreibe unter der Funktion
bestellpreiseine FunktionformatierePreismit einem Parameterpreisvom Typint, die den Preis als Text mit der Währung zurückgibt, also alsstd::string. Für63gibt sie"63 EUR"zurück. Wandle die Zahl mitstd::to_string()in Text um. - 3
Verwende sie in der letzten Zeile, die
mainausgibt: Gib stattfamilie + freundeden AusdruckformatierePreis(familie + freunde)aus. Das Programm gibtZusammen: 63 EURaus.