Funkcije: pitanja i dogovori
 Copyright ã 2003 Ranko Čelustka

 

Koja je razlika između definicije i deklaracije funkcije?

Deklaracija funkcije je u biti zaglavlje funkcije. Definicija funkcije je kompletna funkcija (zaglavlje i tijelo).

Deklaracija daje samo informacije potrebne u pozivu funkcije: ime funkcije, tip vraćene vrijednosti i tipove parametara. Definicija uključuje sve informacije o funkciji, uključujući i način rada (naredbe koje je čine).

 

Gdje se deklaracija funkcije može postaviti?

Deklaracije može biti bilo gdje, ali mora biti prije onih dijelova programa koji tu funkciju pozivaju. Ako je definicija funkcije odvojena od deklaracije mora biti navedena poslije deklaracije funkcije.

 

Koja je uloga naredbe return u funkciji?

Funkcija vraća informaciju dijelu programa koji ju je pozvao preko naredbe return. Return naredba također uzrokuje da se izvršavanje funkcije prekida, nakon čega kontrolu preuzima onaj dio programa koji je funkciju pozvao.

Naredba return ima opći oblik:
return izraz;

s time da je izraz opcija. Ako nedostaje, return uzrokuje samo povratak u dio programa koji je funkciju pozvao – nema vraćene vrijednosti.

 

Može li funkcija imati više return naredbi?

Može. Svaka return naredba može imati drugačiji izraz. Mjerodavna je return naredba na koja se prva izvrši.

 

Može li se return izostaviti?

Može. U tom slučaju funkcija završava kada se dođe do karaj bloka naredbi. Preporuča se uvijek staviti return naredbu.

 

Može li se izostaviti tip vraćene vrijednosti?

Može ako je on integer ili char. Tip integer se pretpostavlja ako nije izričito naveden. Bolje ga je navesti.

 

Koja je razlika između formalnih i stvarnih parametara?

Formalni parametri su oni navedeni u definiciji i deklaraciji funkcije. Prilikom poziva funkcije na njihovom mjestu navode se stvarni parametri.

 

Što su to lokalne varijable?

Lokalne varijable su jednostavno one varijable koje su definirane unutar jednog bloka.  Pošto je tijelo funkcije i samo blok, varijable deklarirane u funkciji su lokalne varijable. One postoje samo dok se izvršava funkcija.

 

Da li su formalni parametri lokalne varijable u funkciji?

Da.

 

Mogu li imena stvarnih i formalnih parametara biti ista? Objasnite!

Mogu. Stvarni parametri su varijable u dijelu programa koji poziva funkciju, dok su formalni parametri lokalne varijable u funkciji. Lokalne varijable u funkciji potpuno su nezavisne i nedostupne za ostale dijelove programa.

 

Na koji način dio programa koji poziva funkciju predaje vrijednosti funkciji?

To se ostvaruje preko parametara. Kada se poziva funkcija, na mjestu formalnog parametra stavlja se stvarni parametar. Njegova vrijednost se kopira u formalni parametar. Sve promjene koje se poslije događaju s formalnim parametrima ne utječu na vrijednosti stvarnih parametara.

Primjerice, neka je funkcija deklarirana ovako:
int zbroj(int x, int y);

i neka se u programu poziva ovako:

suma=zbroj(a, b);

Prilikom poziva funkcije vrijednost stvarnog parametra a kopira se u vrijednost formalnog parametra x. Isto vrijedi i za parametre b i y. Možemo zamisliti da se zapravo izvršavaju ove naredbe: x=a i y=b. Eventualne promjene parametara x i y u funkciji NE mijenjaju vrijednosti stvarnih parametara a i b. Možemo reći da su oni read only tj. funkcija ih može samo čitati, ali ne i pisati po njima (mijenjati im vrijednosti).

Ovakav način predaje vrijednosti funkciji zove se engl. call by value ili passing by value.

Treba naglasiti da su imena stvarnih parametara mogu biti bilo koja, pa mogu biti i jednaka imenima formalnih parametara. Primjerice, mogli smo gornju funkciju pozvati i ovako:
suma
= zbroj(x, y);

U tom slučaju imamo dvije nezavisne varijable koje se zovu x. Jedna je u programu koji zove funkciju, a druga u funkciji. One su dvije različite varijable, potpuno nezavisne, poput ranije spomenutih varijabli a i x.

 

Može li stvarni parametar biti konstanta ili izraz?

Može ako se parametri predaju po vrijednosti (call by value). Primjerice, funkciju deklariranu s

int zbroj (int x, int y);
mogli bi pozvati s

sum = zbroj(2, 3);

ili

sum = zbroj(2, 4+5);

 

Mora li funkcija vratiti neku vrijednost?

Ne mora. Primjerice, ako funkcija samo nešto ispisuje, očito ne vraća nikakvu vrijednost. U tom slučaju u deklaraciji funkcije treba napisati riječ void na mjestu tipa vraćene vrijednosti. Primjerice,
void  ispisiDan (int redniBrojDana);
Takva funkcija poziva se ovako:
ispisiDan(3);

 

Koje ime dati funkciji?

Funkcija koja ne vraća vrijednost obavlja neku radnju. Zato je najbolje da ime funkcije ukazuje na tu radnju. Primjerice, bolje je ispisiDan nego dan.

Ako funkcija vraća vrijednost, znači da nešto izračunava i zato je najbolje nazvati funkciju prema vrijednosti koju vraća. Primjerce, zbroj.

 

Mora li funkcija imati parametre?

Ne mora. Ako nema potrebe da se funkciji  prilikom poziva preda neka vrijednost, takva funkcija nema parametara. U tom slučaju se deklarira ovako:
int baciKocku(void);
a poziva se ovako:
k = baciKocku();

 

Koja je razlika u slijedećim deklaracijama:
int  test(int, int);   i   int test(int x, int y);

Obije deklaracije su ispravne. Imena varijabli unutar deklaracije  se mogu izostaviti.

 

Koja je razlika u slijedećim deklaracijama:
int duzina();   i   int duzina;
Prva deklaracija je deklaracija funkcije, a druga deklaracija je deklaracija varijable.

void u listi parametar se može izostaviti, ali ga je bolje navesti da se lakše uoči o čemu se radi.