Vypsat, nebo vrátit?

Začátečníkům se často plete return s printf, protože to vypadá, že obojí hodnotu nějak vydá. Dělají ale něco úplně jiného:

  • printf vám hodnotu jen ukáže ve výstupu. Program s tím, co se vypsalo, pracovat nemůže.
  • return hodnotu předá programu, který si ji může uložit do proměnné, počítat s ní nebo ji vypsat.

Podívejte se, co se stane, když funkce výsledek vypíše, místo aby ho vrátila, a program s ním pak chce počítat:

#include <stdio.h>

void vypis_soucet(int a, int b) {
    printf("%d\n", a + b);
}

int main(void) {
    int vysledek = vypis_soucet(2, 3);
    printf("%d\n", vysledek * 2);
    return 0;
}

Program se nepřeloží:

main.c:8:9: error: initializing 'int' with an expression of incompatible type 'void'
    8 |     int vysledek = vypis_soucet(2, 3);
      |         ^          ~~~~~~~~~~~~~~~~~~
1 error generated.

Chybová hláška říká, že proměnnou typu int nejde naplnit výrazem typu void. Funkce vypis_soucet je void, a tak nevrací nic, co by šlo uložit. Číslo 5 by jen vypsala. Stejně dopadne i vypis_soucet(2, 3) * 2, jen s chybou invalid operands to binary expression ('void' and 'int'): s ničím počítat nejde.

Oprava je změnit void na int a hodnotu místo vypsání vrátit: return a + b;.

Stává se i opak: funkce hodnotu vrátí, ale nikdo ji nepoužije. Když v main napíšete jen secti(2, 3);, program nevypíše nic. Funkce vrátila 5, ale program si hodnotu neuložil ani ji nevypsal, a tak se ztratila. Pokud ji chcete vidět, vypište ji: printf("%d\n", secti(2, 3));.

Kdy má tedy funkce vypisovat a kdy vracet? Funkce, která něco počítá, má výsledek vrátit. O tom, co se s ním stane, pak rozhodne kód, který ji zavolal: vypíše ho, uloží si ho nebo s ním bude dál počítat. Uvnitř funkce vypisujte jen tehdy, když je vypisování celým jejím úkolem, jako u pozdrav nebo vypis_radek. Takové funkce mívají název začínající vypis_, abyste je na první pohled poznali.

Pokyny

Pizza stojí 200 Kč a nápoj 50 Kč. Funkce cena_objednavky má spočítat cenu objednávky, ale cenu jen vypíše, a tak se program nepřeloží. Opravte funkci, aby cenu místo vypsání vrátila. Program pak vypíše Dohromady: 1300.

Poslední volání v main, cena_objednavky(1, 1);, má ukázat cenu malé objednávky. Teď ale neukáže nic: funkce cenu vrátí a nikdo ji nepoužije. Vypište ji s popiskem: Malá objednávka: 250.

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

6/12