Návratová hodnota je výsledek, který funkce pošle zpátky tomu, kdo ji zavolal. Typ výsledku se píše před jméno funkce a samotné předání zajišťuje příkaz return, který zároveň funkci okamžitě ukončí.
Za slovem return následuje hodnota, kterou má funkce vrátit. Její typ musí odpovídat typu uvedenému v hlavičce funkce – jinak si překladač bude stěžovat, nebo hodnotu potichu převede.
int druha_mocnina(int x) {
return x * x;
}
int vysledek = druha_mocnina(5); // 25
Funkce, která nic nevrací, má návratový typ void. Příkaz return se v ní psát nemusí, ale dá se použít bez hodnoty, když je potřeba funkci ukončit dřív.
void vypis_vysledek(int body) {
if (body < 0) {
printf("Neplatný počet bodů\n");
return; // konec funkce, dál se nepokračuje
}
printf("Získal jsi %d bodů\n", body);
}
Funkce jich může mít několik – provede se ten, ke kterému program dojde jako k prvnímu. Zbytek funkce se pak už nevykoná.
int vetsi(int a, int b) {
if (a > b) {
return a;
}
return b;
}
Vrátit se dá i celá struktura, když má funkce předat víc údajů najednou. Struktura se přitom kopíruje, takže je bezpečné vrátit i tu, která vznikla uvnitř funkce.
typedef struct {
int x;
int y;
} Bod;
Bod stred(Bod a, Bod b) {
Bod s;
s.x = (a.x + b.x) / 2;
s.y = (a.y + b.y) / 2;
return s;
}
Funkce může vrátit i ukazatel, ale nikdy ne na svou lokální proměnnou – ta po skončení funkce zanikne a ukazatel by mířil do neplatné paměti. Vracet se smí ukazatel na paměť získanou přes malloc, na statickou proměnnou nebo na data, která funkce dostala zvenčí.
// ŠPATNĚ: pole zanikne, jakmile funkce skončí
int *spatne(void) {
int pole[3] = {1, 2, 3};
return pole;
}
// SPRÁVNĚ: paměť z haldy funkci přežije (volající ji pak uvolní přes free)
int *spravne(void) {
int *pole = malloc(3 * sizeof(int));
if (pole == NULL) {
return NULL;
}
pole[0] = 1; pole[1] = 2; pole[2] = 3;
return pole;
}
V céčku je zvykem hlásit výsledek operace právě návratovou hodnotou: nula nebo kladné číslo znamená úspěch, záporná hodnota nebo NULL chybu. Přesně tak se chová i většina funkcí ze standardní knihovny.
int deleni(int a, int b, int *vysledek) {
if (b == 0) {
return -1; // chyba, dělit nulou nejde
}
*vysledek = a / b;
return 0; // v pořádku
}
Funkce main vrací celé číslo, které se předá operačnímu systému. Nula znamená, že program doběhl v pořádku, jakákoli jiná hodnota signalizuje chybu – toho využívají skripty, které podle ní poznají, jestli má smysl pokračovat.
int main(void) {
printf("Hotovo\n");
return 0;
}