Lokální proměnné
Uvnitř funkce můžete vytvářet proměnné stejně jako v main. Taková proměnná ale existuje jen uvnitř své funkce: vznikne, když se funkce spustí, a zanikne, když funkce skončí. Mimo funkci ji překladač nezná:
#include <stdio.h>
void vypis_celkem(void) {
int celkem = 5 + 3;
printf("%d\n", celkem);
}
int main(void) {
vypis_celkem();
printf("%d\n", celkem);
return 0;
}Program se nepřeloží:
main.c:10:20: error: use of undeclared identifier 'celkem'
10 | printf("%d\n", celkem);
| ^~~~~~
1 error generated.Na řádku 10 se main snaží vypsat proměnnou celkem, která existuje jen uvnitř funkce vypis_celkem. Hláška use of undeclared identifier znamená, že program používá název, který na tomto místě překladač nezná. Stejné je to s parametry: existují jen uvnitř své funkce.
Proměnná vytvořená uvnitř funkce je lokální: patří jen této funkci. Části programu, ve které proměnná existuje, se říká obor platnosti proměnné (anglicky scope). Už víte, že proměnná vytvořená v bloku kódu, třeba i z cyklu for, existuje jen do } tohoto bloku. Tělo funkce je také blok. A platí to i pro main, protože main je také funkce: ostatní funkce její proměnné nevidí. Když funkce potřebuje hodnotu z main, předejte jí ji jako argument.
Proč je užitečné, že lokální proměnné zůstávají uvnitř svých funkcí?
- Funkce si navzájem nepřekážejí. Dvě funkce mohou mít každá svou proměnnou
celkema jsou to dvě různé proměnné: změna jedné nezmění tu druhou. - Abyste mohli funkci použít, stačí vědět, co jí dát (argumenty) a co vrací (návratovou hodnotu). Jak funguje uvnitř, je její věc.
- Každé volání začíná znovu: proměnné funkce vzniknou nanovo a nic z předchozího volání v nich nezůstane.
Parametr je také lokální proměnná. Při volání funkce se do něj uloží kopie argumentu. Když funkce parametr změní, změní jen kopii a proměnná v main zůstane stejná:
#include <stdio.h>
void vynuluj(int skore) {
skore = 0;
}
int main(void) {
int skore = 10;
vynuluj(skore);
printf("%d\n", skore);
return 0;
}Tento program vypíše:
10Funkce nastavila na 0 svůj parametr skore. Proměnná skore v main je ale jiná proměnná, jen se stejným názvem, a zůstala 10.
Pravidlo je tedy jednoduché: hodnoty se do funkce dostávají přes parametry a ven z ní pomocí return. Když chcete, aby vám funkce dala novou hodnotu, vraťte ji a uložte si ji tam, kde funkci voláte, například skore = pricti_bonus(skore, 10);. V příští lekci, o ukazatelích, poznáte i jinou cestu: jak může funkce změnit proměnnou kódu, který ji zavolal.
Jak psát:
Pokyny
Program se nepřeloží: main vypisuje bonus, ale to je parametr funkce pricti_bonus, a tak existuje jen uvnitř funkce. V main nad voláním vytvořte proměnnou bonus s hodnotou 10 a předejte ji funkci místo čísla 10. Program pak vypíše Bonus: 10.
Skóre je ale pořád 50: funkce přičetla bonus jen ke své kopii. Opravte to: funkce vrátí skore + bonus (její návratový typ tedy bude int) a main si výsledek uloží do své proměnné: skore = pricti_bonus(skore, bonus);. Program vypíše Skóre: 60.
Začněte programovat zdarma
8/12