Studijní materiály
EXTRA Přihlásit Kontakt

Návratové hodnoty funkcí v jazyce C

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čí.

Příkaz return

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 typu void

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);
}

Více příkazů return

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;
}

Vracení struktury

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;
}

Vracení ukazatele

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;
}

Návratová hodnota jako informace o chybě

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
}

Návratová hodnota funkce main

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;
}