V původním
K&R Céčku se nemusel zadávat návratový typ funkce, pokud tam nebylo nic, předpokládal se automaticky int. A naopak, když se do funkce nezadávaly žádné parametry, nebylo potřeba deklarovat vstupní typ/y:
Jenže kvůli tomu vznikla spousta zbytečných chyb, které napáchaly hromadu škody. C na rozdíl od Pascalu nehlídá za běhu vůbec nic, takže se může stát cokoliv. Proto vznikla norma
ANSI C, která nařizuje povinné typování. Překladače sice starší programy přeloží, ale je to kvůli zpětné kompatibilitě, v nových se původní způsob nemá používat. Proto je potřeba zadat jak návratový typ, tak typy všeho co do funkce vstupuje, a pokud něco z toho neexistuje, musí se zadat "prázdný" typ
void:
Rozdílů bylo více, například deklarace vstupních proměnných nebo používání složených operátorů, ale postupně (jazyk C vznikl už před čtyřiceti lety, takže má za sebou dost dlouhý vývoj) byly potenciálně nebezpečné nebo nejednoznačné konstrukce z jazyka odstraněny a dnes je při správném použití C dost bezpečný jazyk. Ale jen při správném použití, což obnáší například kontrolování veškerých návratových hodnot!
Takže nejdřív ukázka funkce které se předávají dvě hodnoty, a vrací jejich součet:
Kód: Vybrat vše
int sum(int a,int b)
{
return a+b;
}
Podobná funkce, která sice hodnotu vrací, ale nic jí není potřeba dávat, jednoduchý generátor náhodných čísel s automatickým nastavením počáteční hodnoty při prvním spuštění:
Kód: Vybrat vše
int random(void)
{
static int seed=0;
if (!seed)
seed=time(NULL);
seed=seed*12345+6789;
return seed;
}
Základ je ten, že když máš funkci vracející třeba hodnotu typu int (a samozřejmě jakéhokoliv jiného), musíš jí mít ukončenou příkazem
return hodnota; A to ty jsi neměl. Jediný případ kdy se z funkce nevrací příkazem return je právě ten, kdy zadáš návratovou hodnotu void, tedy prázdno.
A nakonec funkce která nic nevrací, zato mění obsah "propůjčených" proměnných, prohodí je navzájem:
Kód: Vybrat vše
void swap(int* a,int* b)
{
int w;
w=*a;
*a=*b;
*b=w;
}