You are on page 1of 19

Funkcije i Varijable

Funkcije
• Funkcija je programska cjelina koja uzima neke ulazne podatke, izvršava
odreden niz naredbi i vraća rezultat svog izvršavanja pozivnom programu.
Pomću funkcija razbijamo složene programske zadaće na niz jednostavnijih
cjelina. Time postižemo veću jasnoć u programa i olakšavamo buduće
modifikacije.
• Svaka funkcija treba biti osmišljena tako da obavlja jednu dobro definiranu
zadaću te da korisnik funkcije ne mora poznavati detalje njene
implementacije da bi ju koristio. Tada je funkciju moguće koristiti u različitim
programima, kao što je to slučaj s funkcijama iz standardne biblioteke.
• Funkcija ima oblik
Funkcije
tip_podatka ime_funkcije(tip_1 arg_1, ... ,tip_n arg_n)
{
tijelo funkcije
}
• gdje je tip podatka tip podatka koji će funkcija vratiti kao rezultat svog izvršavanja.
• Unutar zagrada nalazi se deklaracija formalnih argumenata funkcije.
• Prvi argument arg 1 je varijabla tipa tip 1 itd.
• Deklaracije pojedinih argumenata medusobno se odvajaju zarezom.
• Unutar vitičastih zagrada pojavljuje se tijelo funkcije koje se sastoji od deklaracija varijabli i
izvršnih naredbi.
• Funkcija vraća rezultat svog izvršavanja pomoću naredbe return. Opći oblik te naredbe je
return izraz;
Funkcije
• Vrijednost izraza se vraća dijelu programa koji poziva funkciju.
• Izraz se može staviti u oble zagrade ali to nije nužno.
• Vrijedi sljedeće pravilo:
Funkcija može vratiti aritmetički tip, strukturu, uniju ili pokazivač ali ne može
vratiti drugu funkciju ili polje.
Ako je tip izraza u naredbi return različit od tipa podatka koji funkcija vraća,
izraz će biti konvertiran u tip podatka. Takvu situaciju treba naravno
izbjegavati.
Varijable
• U programskom jeziku C sve varijable moramo deklarirati prije njihove upotrebe.
• Deklaracija definira tri svojstva varijable: tip, doseg i vijek trajanja.
• Pojedini elementi deklaracije zadaju se eksplicitno, pomoću ključnih riječi jezika, ili
implicitno, položajem deklaracije u programu.
• Isto vrijedi i za deklaracije funkcija. Tip varijable uvijek se uvodi eksplicitno ključnim
riječima int, float, double i drugim.
• Doseg i trajanje varijable odredeni su položajem deklaracije u programu, a mogu se
modificirati ključnim riječma static i extern.
Doseg varijable

• Doseg varijable je dio programa u kojem je njena deklaracija vidljiva i u


kojem se stoga varijabli može pristupiti putem njenog imena.
• Dva su osnovna tipa dosega: to može biti blok ili datoteka.
• Varijable s dosegom bloka nazivamo lokalnim varijablama, dok varijable s
dosegom datoteke nazivamo globalnim.
• Ako je izvorni kod razbijen u više datoteka, onda su globalne varijable,
deklarirane extern, vidljive i izvan datoteke u kojoj su definirane.
Lokalne varijable

• Blok naredbi čini svaki niz naredbi omeđen vitičastim zagradama.


• Na primjer, tijelo funkcije je jedan blok naredbi.
• Programski jezik C dozvoljava da se u svakom bloku deklariraju varijable.
• Takve varijable nazivamo lokalnim. Deklaracija lokalne varijable
unutarnekog bloka mora prethoditi prvoj izvršnoj naredbi u tom bloku
(prema standardu C90)
Lokalne varijable
if(n>0) {
int i; /* deklaracija varijable */
for(i=0; ; i<n; ++i)
......
}

• Izvan bloka ne može joj se pristupiti, tj. njeno ime izvan bloka nije definirano.
• Stoviše, izvan bloka može biti deklarirana varijabla istog imena.
• Ta je varijabla tada unutar bloka nedostupna, jer ju skriva varijabla deklarirana
u bloku.
Lokalne varijable

• Doseg varijable definirane unutar nekog bloka je taj blok.


Doseg formalnog argumenta je tijelo funkcije.
Globalne varijable

• Varijabla deklarirana u vanjskom bloku vidljiva je u svakom unutarnjem


bloku, ako u njemu nije definirana varijabla istog imena.
• Ako je varijabla definirana izvan svih blokova, onda je njen doseg čitava
datoteka u kojoj je definirana. Takvu varijablu nazivamo globalnom.
Globalne varijable

#include <stdio.h>
int x=3;
void ispisi(void) {
int y=4;
printf("x=%d, y=%d\n",x,y);
} int main(void){
ispisi();
return 0;
}
Globalne varijable

• Globalne varijable se definiraju izvan svih funkcija i njihova je svrha prijenos


podataka izmedu funkcija. Svaka funkcija može doseći globalnu varijablu i
promijeniti njenu vrijednost. Na taj načni više funkcija može komunicirati bez
upotrebe formalnih argumenta.
• Naglasimo još da je globalna varijabla vidljiva od mjesta svoje deklaracije do kraja
datoteke u kojoj se nalazi. Stoga globalne varijable deklariramo na početku
datoteke prije svih funkcija.
• Funkcije su po svojoj prirodi globalni objekti. Funkcija definirana na bilo kojem
mjestu može se dohvatiti iz bilo kojeg dijela programa ako ima prototip. Definicija
funkcije unutar druge funkcije nije dozvoljena.
Argumenti funkcijskog prototipa

• Argumenti navedeni u funkcijskom prototipu imaju doseg koji ne seže dalje


od prototipa. To znači da imena navedena u prototipu nisu važna i mogu se
podudarati s imenima drugih varijabli u programu. Stoviše, prevodilac nam
dopušta da ispustimo imena varijabli. Jedina iznimka je deklaracija polja
varijabilne dimenzije
Lokalne varijable i standard C99

• Standard C99 je uveo izmjene u varijable blokovnog dosega koje C čine


kompatibilnijim s C++om. Izmjene su sljedeće:
• . • Varijabla može biti deklarirana bilo gdje unutar bloka, a ne samo na
njegovom početku. Deklaracije i izvšsne naredbe mogu se sada slobodno
ispreplitati
• • Proširuje se pojam bloka kako bi obuhvatio petlje for, while i do while, te
naredbu if, i u slučaju kada se ne koriste vitičaste zagrade.
• Ideja prvog pravila je omogućiti deklaraciju varijable što bliže mjestu na
kojem se koristi. Time se postiže veća čitljivost koda i olakšava prevodiocu
zadatak optimizacije.
• Drugo pravilo omogućava definiciju varijable unutar for naredbe
Funkcijski doseg

• Napomenimo još da postoji i tzv. funkcijski doseg, ali se on


primijenjuje samo na labele u goto naredbi.
• Funkcijski doseg znači da je goto labela vidljiva u cijeloj
funkciji, bez obzira na blok u kojem se pojavljuje.
• Pomoću goto naredbe ne može se izaći iz funkcije.
Vijek trajanja varijable
• Svakoj varijabli prevodilac pridružuje odredeni
memorijski prostor.
• Vijek trajanja varijable je vrijeme za koje joj je pridružena
njena memorijska lokacija, dakle ukupno vrijeme njene
egzistencije.
• Prema vijeku trajanja varijable dijelimo na automatske i
statičke.
Automatske varijable

• Svaka varijabla kreirana unutar nekog bloka (dakle unutar neke


funkcije), koja nije deklarirana s ključnom riječi static, je
automatska varijabla.
• Automatske varijable se kreiraju na ulasku u blok u kome su
deklarirane i uništavaju na izlasku iz bloka. Memorija koju je
automatska varijabla zauzimala oslobađa se za druge varijable.
Automatske varijable
......
void f(double x) {
double y=2.71;
static double z;
....
}

• varijable x i y su automatske dok z nije, jer je deklarirana s


ključnom riječi static.
Automatske varijable
• Automatske varijable mogu se inicijalizirati, kao što je to slučaj s
varijablom y.
• Inicijalizacija se vrši pri svakom novom ulazu u blok u kome je
varijabla definirana. Tako će varijabla y biti ponovo kreirana i
inicijalizirana pri svakom novom pozivu funkcije f().
• Automatska varijabla koja nije inicijalizirana na neki način, na
ulasku u blok u kome je definirana dobiva nepredvidivu
vrijednost. Najčešće je to vrijednost koja se zatekla na
pridruženoj memorijskoj lokaciji.
• Osim konstantnim izrazom, inicijalizaciju automatsje varijable
moguće je izvršiti i izrazom koji nije konstantan

You might also like