Rückgabewerte
Die Funktion zeige_linie aus der vorigen Übung gibt etwas aus, und das war's. Aber was, wenn du mit einem Ergebnis weiterrechnen willst, zum Beispiel um die Flächen aller Zimmer einer Wohnung zusammenzuzählen? Ein ausgegebener Wert erscheint nur in der Ausgabe, und das Programm kann damit nicht weiterarbeiten.
Deshalb können Funktionen einen Wert zurückgeben. Die Anweisung return schickt einen Wert an die Stelle zurück, an der die Funktion aufgerufen wurde. Vor den Namen der Funktion schreibst du dann statt void den Datentyp des Werts, den sie zurückgibt:
#include <stdio.h>
int addiere(int a, int b) {
return a + b;
}
int main(void) {
int ergebnis = addiere(2, 3);
printf("%d\n", ergebnis);
return 0;
}Dieses Programm gibt aus:
5Der Aufruf addiere(2, 3) führt die Funktion aus, und die Funktion gibt 5 zurück. Du kannst dir vorstellen, dass der Aufruf durch den Wert ersetzt wird, den er zurückgegeben hat: Aus int ergebnis = addiere(2, 3); wird int ergebnis = 5;. Der Wert, den eine Funktion zurückgibt, heißt Rückgabewert, und sein Typ, hier int, ist der Rückgabetyp. Eine Funktion kann auch ein double, ein char oder ein bool zurückgeben:
#include <stdio.h>
double mittelwert(int a, int b) {
return (a + b) / 2.0;
}
int main(void) {
printf("%.2f\n", mittelwert(7, 8));
printf("%.2f\n", mittelwert(3, 4));
return 0;
}Dieses Programm gibt aus:
7.50
3.50Beachte die 2.0: Mit 2 wäre es eine Division von Ganzzahlen, und mittelwert(3, 4) würde 3.00 zurückgeben.
Einen Aufruf kannst du überall verwenden, wo du einen Wert schreiben könntest: gleich ausgeben, damit rechnen oder in eine Bedingung setzen:
#include <stdio.h>
int addiere(int a, int b) {
return a + b;
}
int main(void) {
printf("%d\n", addiere(2, 3));
int gesamt = addiere(2, 3) * 2;
printf("%d\n", gesamt);
if (addiere(2, 3) > 4) {
printf("Mehr als 4\n");
}
return 0;
}Dieses Programm gibt aus:
5
10
Mehr als 4In printf("%d\n", addiere(2, 3)) ruft das Programm zuerst addiere(2, 3) auf und gibt dann die 5 aus, die die Funktion zurückgegeben hat. In addiere(2, 3) * 2 wird der Aufruf zu 5, und 5 * 2 ist 10.
Jetzt weißt du auch, was das int vor main bedeutet: main gibt ebenfalls eine Ganzzahl zurück. Sie geht an den, der das Programm gestartet hat, und 0 bedeutet, dass das Programm ohne Probleme zu Ende gegangen ist. Das ist die Aufgabe von return 0; am Ende von main.
Eine Funktion, die nicht void ist, hat versprochen, einen Wert zurückzugeben, also muss sie einen zurückgeben. Ein return zu vergessen ist ein häufiger Fehler. Diese Funktion gibt die Summe aus, aber sie gibt sie nicht zurück:
#include <stdio.h>
int addiere(int a, int b) {
printf("%d\n", a + b);
}
int main(void) {
int ergebnis = addiere(2, 3);
printf("%d\n", ergebnis);
return 0;
}Das Programm lässt sich nicht kompilieren:
main.c:5:1: error: non-void function does not return a value [-Werror,-Wreturn-type]
5 | }
| ^
1 error generated.Die Fehlermeldung zeigt auf das } am Ende der Funktion und sagt, dass eine Funktion, die nicht void ist („non-void function“), keinen Wert zurückgibt („does not return a value“). Anderswo warnen Compiler hier oft nur; hier ist es ein Fehler, damit du ihn nicht übersehen kannst. Die Lösung ist return a + b; anstelle des printf.
So schreibst du es:
Anweisungen
- 1
Das Programm lässt sich nicht kompilieren: Der Fehler
call to undeclared function 'rechteck_flaeche'sagt, dass die Funktion noch nicht existiert. Schreibe sie anstelle des Kommentars: Sie hat zwei Parameter vom Typint,breiteundhoehe, und gibtbreite * hoehezurück. Das Programm gibt dannKüche: 12undSchlafzimmer: 20aus. - 2
Die Wohnung hat auch ein Wohnzimmer, das 6 × 5 Meter misst. Lege am Ende von
main, vorreturn 0;, eine Variablewohnzimmermit seiner Fläche an, berechnet mit der Funktionrechteck_flaeche. Gib dann die Fläche der ganzen Wohnung,kueche + schlafzimmer + wohnzimmer, mit einer Beschriftung aus:Ganze Wohnung: 62. - 3
Ein neuer Boden kostet 12,50 € pro Quadratmeter. Schreibe über
maineine Funktionbodenpreismit einem Parameterflaechevom Typint, die den Preis des Bodens,flaeche * 12.5, alsdoublezurückgibt. Gib am Ende vonmainden Preis des Bodens für die ganze Wohnung mit zwei Nachkommastellen aus:Boden: 775.00.