Struktura C programa
Program pisan u jeziku C se sastoji od nekoliko elemenata:
  • promenljive – predstavljaju podatke nad kojima se vrši obrada, a takođe mogu predstavljati i hardverske ulaze/izlaze kao i interne registre;
  • funkcije – elementi koji opisuju sam tok programa, odnosno realizuju algoritam. Same funkcije, na neki način predstavljaju potprograme;
  • preprocesorske direktive – komande kojima se mogu dodati novi elementi jeziku, definisati simbolička imena, isključiti pojedini delovi programskog koda iz prevođenja kao i zadati specifična uputstva prevodiocu za generisanje konačnog koda;
  • komentari – proizvoljan tekst čija je jedina svrha objašnjavanje i dokumentovanje pojedinih delova programa.
Promenljive
U savremenim programskim jezicima, definisanje tipa promenljive je od velikog značaja. Time se obezbeđuje da se ni jedan podatak ne skladišti u memorijskom prostoru većem nego što zaista treba. Sa druge strane, prevodilac strogo vodi računa o tipu svakog podatka i može da upozori programera u slučaju da je napravio neki previd – npr. pokušao da obavi nekakvu operaciju sa podacima nekompatibilnog tipa. Kod novijih prevodilaca (uticaj jezika C++), moguće je definisati i konstantnost promenljivih određenog tipa. Veoma važni tipovi podataka tipični za jezik C su nizovi i pokazivači. Za svaki tip podataka može se izvesti odgovarajući niz ili pokazivač. Posebnu vrstu tipova promenljivih čine strukture i unije koje ćemo kasnije proučavati.
Tip promenljive u širem smislu, mogao bi da podrazumeva i vrstu memorije u kojoj se skladišti, način kreiranja promenljive kao i oblast važenja promenljive.
Tipovi promenljivih
Promenljive se u jeziku C definišu na sledeći način:
[mem/scope/const] tip ime_promenljive [= vrednost];
Delovi unutar uglastih zagrada su opcioni, dakle ne moraju se uvek navesti. Ako se navede deo na početku, pobliže se određuje neka od karakteristika tipa promenljive u širem smislu (način kreiranja, oblast važenja itd.). Promenljiva se može i inicijalizovati odmah po definisanju navođenjem opcionog dela sa desne strane.
Osnovni tipovi promenljivih
char – osnovna namena je skladištenje jednog karaktera kodiranog ASCII (mada bi mogao biti i bilo koji drugi osmobitni kod) kodom. Tipičan je po tome da je to uvek najkraći tip (po pitanju memorijskog prostora) na datom sistemu, tj. ima najmanji broj bita, a to je po pravilu 8;
int – standardni označeni celobrojni tip. Označeni znači da skladištena vrednost može biti i pozitivna i negativna, a u operacijama sa tom vrednošću vodiće se računa o znaku. Vrednost može biti samo ceo broj. Način predstavljanja broja je binarni, negativni brojevi se predstavljaju u komplementu dvojke. Ako procesor za koji se program prevodi ima registre od 32 ili više bita, tip int se skladišti sa istim tim brojem bita;
short – kratka celobrojna vrednost (označena). Po pravilu 16-bitna promenljiva. Sve ostalo što je rečeno za tip int, važi i ovde;
long – duga celobrojna vrednost (označena). Po pravilu 32-bitna promenljiva. Sve ostalo što je rečeno za tip int, važi i ovde;
unsigned – ovo je zapravo prefiks koji bilo koji od gore navedenih tipova pretvara u neoznačenu celobrojnu vrednost iste dužine. Ako se navede samo unsigned, podrazumeva se unsigned int. Primetimo, da se u računskim operacijama i tip char smatra označenom vrednošću, a sa unsigned char dobijamo neoznačenu varijantu;
float – realna promenljiva, tj. vrednost predstavljena u pokretnom zarezu.
double – realna promenljiva, sve rečeno za tip float važi i ovde. Razlika je u broju bita koji se koristi za skladištenje promenljive. Ovaj prostor je veći u slučaju tipa double, a time se povećava i broj značajnih cifara koje se pamte za ovakvu promenljivu, ali se troši i više memorije;
Konstantne promenljive
Navođenjem ključne reči const ispred tipa promenljive, sve promenljive definisane u nastavku biće navedenog tipa, ali će imati dodatno ograničenje konstantnosti. Možemo smatrati da svaki tip (osnovni ili izvedeni) može imati običnu i konstantnu varijantu. Definisanje promenljive kao konstantne ima dve posledice:
  • glavna karakteristika konstante je da njena vrednost neće biti promenjena tokom izvršavanja programa. Zbog toga, ako prevodilac u nekom delu programa primeti pokušaj dodeljivnja vrednosti konstantnoj promenljivoj, prijaviće grešku. Na ovaj način, prevodilac nam može pomoći u otkrivanju logičkih grešaka u programu;
  • budući da uvodimo ograničenje konstantnosti na promenljivu, prevodilac sa takvom promenljivom može da postupa drugačije i može automatski da uvede optimizacije i stvori kraći i efikasniji izvršni kod. Npr. konstantni niz može biti smešten u programsku memoriju, ostavljajući više radne memorije na raspolaganju ostatku programa.

Budući da vrednost konstantne promenljive ne može naknadno biti promenjena, toj promenljivoj mora biti dodeljena vrednost na mestu gde se definiše. Npr.:

const int limit = 100;

Oblast važenja promenljivih i njihov životni vek

Sva imena (promenljivih ili funkcija), u jeziku C se nazivaju identifikatorima. Što se imena (identifikatora) promenljivih tiče, svako ima tačno određenu oblast u programu iz kog se može koristiti, odnosno oblast važenja ili vidljivosti. Oblast važenja je često u uskoj sprezi sa životnim vekom promenljive, tako da ćemo obe osobine razmotriti zajedno i to navođenjem različitih mogućnosti koje su na raspolaganju i odgovarajućeg načina definisanja promenljive. Opcioni deo scope u gornjim obrascima se odnosi na ovo.
Automatske promenljive
Svaka promenljiva definisana unutar tela neke funkcije je podrazumevano automatska. Ipak, promenljiva se može eksplicitno definisati automatskom navođenjem ključne reči auto ispred definicije promenljive. No, to je gotovo u svakoj situaciji suvišno. Npr.:
auto int g;
Automatske promenljive jedino imaju smisla unutar funkcija jer su strogo lokalne i postoje samo dok se izvršava funkcija u kojoj su definisane. Strogo lokalne znači da se promenljiva definisana kao automatska unutar neke funkcije može koristiti samo unutar te funkcije, a nije joj moguće (barem ne pod njenim imenom) pristupiti iz neke druge funkcije. Kod većine C prevodilaca, njihova definicija mora da sledi na samom početku opisa funkcije. Ove se promenljive kreiraju i po potrebi inicijalizuju na početku izvršavanja funkcije u kojoj su definisane, a nakon potpunog završetka izvršavanja iste funkcije memorijski prostor koji zauzimaju se oslobađa.
Važno je primetiti, da se svakim pozivom funkcije ove promenljive ponovo kreiraju i inicijalizuju. Ovo je posebno važno ako funkcija poziva samu sebe (rekurzija). Tada će pri svakom novom pozivu funkcije nastajati novi set promenljivih.
Lokalne statičke promenljive
Ove promenljive su što se oblasti važenja tiče iste kao i automatske, odnosno moguće im je pristupiti samo iz funkcije u kojoj su definisane. Samim tim, moraju biti definisane na istom mestu kao i automatske, unutar neke funkcije. Razlikuju se u tome što se memorijski prostor za njih rezerviše i one bivaju inicijalizovane na početku izvršavanja programa. Na taj način, pri sledećem pozivu funkcije u kojoj je statička promenljiva definisana, vrednost te promenljive se zatiče onakvom kakva je bila pri poslednjem izvršavanju te funkcije (nema ponovne inicijalizacije). Ovo ima odgovarajuće posledice i na rekurziju i može izazvati greške u algoritmu ako se izgubi iz vida.
Lokalne statičke promenljive se definišu dakle, unutar neke funkcije navođenjem ključne reči static inpred definicije promenljive. Npr.:
static int brojac;
Globalne promenljive
Kao što bi se očekivalo na osnovu naziva, ovim promenljivama može se pristupati iz celog programa, tj. iz svih funkcija koje pripadaju određenom programu. Izuzetak je jedino ako neka lokalna promenljiva (automatska ili statička) istog imena “pokriva” globalnu. Npr. ako je promenljiva int x definisana i kao globalna promenljiva i kao automatska u funkciji test, unutar te funkcije moći će se pristupiti samo automatskoj promenljivoj x.
Globalnu promenljivu treba definisati bez posebnih ključnih reči van tela bilo koje funkcije. Takva promenljiva će biti dostupna (navođenjem njenog imena tj. identifikatora) unutar tela svake fnkcije koja pripada tom programu. Npr. promenljiva xg će biti dostupna iz funkcije t1, ali neće iz funkcije t2 jer je tu pokriva lokalna promenljiva istog imena):
int xg;
void t1(void)
{
xg = 6;    // pristupa se globalnoj prom. cxg
}
void t2(void)
{
int xg;    // lokalna automatska promenljiva
xg = 3;    // globalno xg je pokrivena lokalnim xg
}
Last modified: Saturday, 17 November 2018, 7:47 PM