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:
printfvám hodnotu jen ukáže ve výstupu. Program s tím, co se vypsalo, pracovat nemůže.returnhodnotu 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.
Jak psát:
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
6/12