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 celkem a 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:

10

Funkce 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.

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

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

Nebo se registrujte pomocí:

8/12