Většina programovacích jazyků umožňuje rozdělit objemný, dlouhotrvající kód na úhledné, pojmenované části. Tyto části se nazývají funkce. Umožňují vám znovu použít kód namísto přepisování stejné logiky znovu a znovu. Funkce přijímá vstupy, známé jako parametry, a vytváří výsledek. V C můžete předat tolik parametrů, kolik potřebujete. Kompilátor se nestará o pořadí, ve kterém jsou funkce deklarovány ve zdrojovém souboru, pokud zná název funkce předtím, než se ji pokusí provést.
Krátce jsme se tohoto tématu dotkli funkcí rand. Toto je nejjednodušší možná funkce. Nepřijímá nic a vrací celé číslo.
Řádek int rand() říká kompilátoru, že rand je funkce. Nepotřebuje žádné parametry a vrací celé číslo. V této konkrétní verzi nejsou žádné lokální proměnné. Pokud by existovaly, objevily by se ihned po úvodní složené závorce {. V C můžete deklarovat proměnné kdekoli za {. Existují, dokud není dosaženo odpovídající uzavírací složené závorky }. Pak zmizí. Zatímco jsou “živé”, lokální proměnné jsou uloženy v systémovém zásobníku.
Všimněte si, že za rand() není žádný středník. Pokud jej omylem nastavíte, kompilátor vygeneruje obrovské množství nesmyslných chybových zpráv. I když nejsou žádné parametry, závorky jsou povinné. Bez nich nedeklarujete funkci, ale jednoduše celé číslo.
Návratový příkaz a více výstupních bodů
Operátor return je kritický pro jakoukoli funkci, která vrací výsledek. Nastaví návratovou hodnotu a okamžitě ukončí funkci. Do jedné funkce můžete umístit více příkazů return a vytvořit tak více výstupních bodů.
Pokud zapomenete příkaz return ve funkci, která má vracet hodnotu, funkce se ukončí, když dosáhne uzavírací závorky. Vrátí náhodnou, „odpadní“ hodnotu. Většina moderních kompilátorů vás upozorní, pokud zapomenete vrátit konkrétní hodnotu. C podporuje vrácení jakéhokoli typu: int, float, char, struct a další.
Existuje několik správných způsobů volání funkce rand. Nejběžnější je zadání:
Zde proměnná x získá hodnotu vrácenou rand. Při volání musíte vložit závorky, i když neexistují žádné parametry. Bez nich x obdrží paměťovou adresu funkce rand. To je zřídka to, co jste zamýšleli udělat.
Můžete to také nazvat uvnitř podmínky:
Nebo výsledek ignorujte:
V druhém případě se funkce provede, ale vrácená hodnota se zahodí. Pravděpodobně byste to neměli dělat s rand, ale mnoho funkcí používá návratovou hodnotu jako kód chyby. Pokud víte, že chyba není možná, je přijatelné kód zahodit.
Zpracování neplatných vratek
Někdy není potřeba nic vracet. K tomu se používá návratový typ void.
Tato funkce zobrazuje text, ale nevrací žádnou hodnotu. Říkáte tomu takto:
Znovu vložte závorky. Pokud je vynecháte, funkce se nezavolá. Na mnoha systémech se zkompiluje správně, ale nic neudělá.
Možnosti a starší styl kódu C
Funkce C mohou mít parametry libovolného typu. Zde je funkce, která vypočítá faktoriál čísla:
Parametr i je předán jako celé číslo. Chcete-li předat více parametrů, oddělte je čárkami.
Jazyk C se vyvinul. Čas od času uvidíte starý kód napsaný ve „starém stylu“. Vypadá to takto:
Musíte být schopni přečíst tento starý zápis. Funguje to úplně stejně. Je to jen jiná syntaxe. Měli byste použít “nový styl” známý jako ANSI C, kde jsou typy deklarovány v seznamu parametrů. Starý styl použijte pouze v případě, že víte, že posíláte kód někomu s kompilátorem mimo ANSI.
Proč je to důležité pro běžné uživatele?
Nemůžete psát funkce C každý den. Ale pochopení toho, jak fungují, mění způsob, jakým přemýšlíte o softwaru. Pokaždé, když kliknete na tlačítko ve webové aplikaci, funkce pravděpodobně toto kliknutí zpracuje, zkontroluje parametry a vrátí stav. Pokud jste někdy viděli „chybu běhu“ nebo „přetečení zásobníku“, narazili jste na limity těchto mechanismů.
Rozdíl mezi předáním hodnoty a předáním odkazu (adresy paměti) je častým zdrojem chyb. To je často skryté v jazycích na vysoké úrovni. V C je to jasné. Vědět, že rand bez závorek vrací adresu, nikoli číslo, ušetří hodiny ladění.
Debata o starém stylu vs. novém stylu se většinou soustředí na nové projekty. ANSI C je standard. Ale starší kódové základny stále existují. Schopnost čtení int add(i,j) int i; int j; vám zabrání uvíznout v kódu, který vypadá špatně, ale funguje perfektně. To je otázka gramotnosti.
Opravdu vám záleží na stacku? Pokud váš program neočekávaně selže, jediným vodítkem je trasování zásobníku. Lokální proměnné mizející po dosažení uzavírací závorky nejsou chybou. Toto je funkce. Díky tomu je využití paměti předvídatelné.
Neexistuje žádný dokonalý způsob psaní kódu. Existuje pouze způsob, který se zkompiluje a způsob, který se nezkompiluje. Ponechte závorky. Dejte si pozor na návratky. A nepředpokládejte, že vás kompilátor zachrání před vlastními syntaktickými chybami. On tě nezachrání.







































