Ausgeben oder zurückgeben?
Anfänger verwechseln oft return und printf, weil beide scheinbar einen Wert herausgeben. Sie tun aber ganz verschiedene Dinge:
printfzeigt dir einen Wert nur in der Ausgabe. Das Programm kann mit dem Ausgegebenen nichts anfangen.returngibt den Wert an das Programm, das ihn in einer Variablen speichern, damit 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 <stdio.h>
void zeige_summe(int a, int b) {
printf("%d\n", a + b);
}
int main(void) {
int ergebnis = zeige_summe(2, 3);
printf("%d\n", ergebnis * 2);
return 0;
}Das Programm lässt sich nicht kompilieren:
main.c:8:9: error: initializing 'int' with an expression of incompatible type 'void'
8 | int ergebnis = zeige_summe(2, 3);
| ^ ~~~~~~~~~~~~~~~~~
1 error generated.Die Fehlermeldung sagt, dass eine Variable vom Typ int nicht mit einem Ausdruck vom Typ void initialisiert werden kann. Die Funktion zeige_summe ist void, gibt also nichts zurück, was man speichern könnte; sie würde nur 5 ausgeben. zeige_summe(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 umgekehrt passieren: Eine Funktion gibt einen Wert zurück, aber niemand verwendet ihn. Wenn du in main nur addiere(2, 3); schreibst, gibt das Programm nichts aus. Die Funktion hat 5 zurückgegeben, aber das Programm hat den Wert weder gespeichert noch ausgegeben, also ging er verloren. Wenn du ihn sehen willst, gib ihn aus: printf("%d\n", addiere(2, 3));.
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 damit weiterrechnen. Gib innerhalb einer Funktion nur aus, wenn das Ausgeben ihre ganze Aufgabe ist, wie bei begruesse oder zeige_reihe. Solche Funktionen haben oft Namen, die mit zeige_ beginnen, damit man sie auf einen Blick erkennt.
So schreibst du es:
Anweisungen
- 1
Eine Pizza kostet 9 € und ein Getränk 3 €. Die Funktion
bestellpreissoll den Preis einer Bestellung berechnen, aber sie gibt den Preis nur aus, deshalb lässt sich das Programm nicht kompilieren. Korrigiere die Funktion so, dass sie den Preis zurückgibt, statt ihn auszugeben. Das Programm gibt dannZusammen: 63aus. - 2
Der letzte Aufruf in
main,bestellpreis(1, 1);, soll den Preis einer kleinen Bestellung zeigen. Jetzt zeigt er aber nichts: Die Funktion gibt den Preis zurück, und niemand verwendet ihn. Gib ihn mit einer Beschriftung aus:Kleine Bestellung: 12.