C (programski jezik)

програмски језик

C (transkr. Ce) proceduralni je programski jezik, nastao 1972. godine. Autor jezika je Denis Riči, a nastao je u istraživačkom centru Белове лабораторије u Nju Džerziju za potrebe operativnog sistema UNIX.

C
Programski jezik C (knjiga) (često se naziva K&R), prva knjiga o C jeziku
Izgovara seCe
ModelImperativni (proceduralni), struktuiran
Pojavio se1972. god.; pre 52 godine (1972)
Autor(i)Denis Riči i Belove laboratorije
Dizajner(i)Denis Riči
Aktuelna verzijaC17
Datum aktuelne verzijejun 2018. god.; pre 5 godina (2018-06)
Sistem tipovastatički, slabi
ImplementacijeK&R, GCC, Clang, Intel C, Microsoft Visual C++
DijalektiCyclone, Unified Parallel C, Split-C, Cilk, C*
UticajiB, BCPL, ALGOL 68, Asembler, PL/I, FORTRAN
Uticao naAMPL, AWK, csh, C++, C--, C#, Objective-C, D, Go, Java, JavaScript, Julia, Limbo, LPC, Perl, PHP, Pike, Processing, Python, Ring, Rust, Seed7, Vala, Verilog (HDL), Nim
Veb-sajtwww.iso.org/standard/74528.html
www.open-std.org/jtc1/sc22/wg14/

Nastanak uredi

Prve verzije operativnog sistema UNIX su bile, zbog neophodne brzine izvršavanja, pisane koristeći asembler, ali se ovaj projekat brzo približavao svom kraju jer je programski kod asemblera izrazito velik i težak za održavanje. Arhitektama UNIX-a je bio potreban programski jezik koji bi zadržao efikasnost asemblera, ali istovremeno pružio i komfor već postojećih viših programskih jezika, poput Paskala, Kobola i dr. Ideja je bila načiniti programski jezik koji bi imao sve ovo, ali čija arhitektura i logika ne bi mnogo odudarala od asemblerske. Zbog toga C-ove kontrolne strukture nalikuju na asemblerske, a postoje i izrazi koji neposredno pozivaju odgovarajuće asemblerske instrukcije. Tako, izraz x++ poziva asemblersku instrukciju INC. Jezik je bio potpun uspeh, i koristio se za pisanje svih budućih verzija UNIX-a. U gradnji projekta je učestvovao kao glavni projektant Denis Riči, koji je uostalom bio i jedan od vodećih projektanata za operativni sistem UNIX.

Programski jezik C je jezik opšte namene. Iako je razvijan kao „jezik za sistemsko programiranje”, podjednako dobro se koristi za pisanje značajnih programa u različitim oblastima. C je takođe veoma uticao na mnoge druge popularne programe, posebno na C++, koji je originalno razvijan kao nadgradnja C-a.

K&R C uredi

Brajan Kernigen (engl. Brian Kernighan) i Denis Riči (engl. Dennis Ritchie) su 1978. objavili prvo izdanje knjige Programski jezik C (engl. The C Programming Language). Ova knjiga, poznata C programerima kao „K&R”, služila je mnogo godina kao nezvanična specifikacija jezika. Verzija С-а koju ona opisuje često se naziva „K&R С”. Drugo izdanje ove knjige pokriva kasniji S89 ANSI C standard. Američki nacionalni institut za standarde (American National Standard Institute (ANSI)) je 1983 formirao komitet, X3J11, da ustanovi standard za C. Standard je ratifikovan 1989 kao ANSI X3.159-1989 „Programming Language C”. Ova verzija С-а se često naziva ANSI C, Standardni C, ili ponekad С89. ANSI C standard je sa nekoliko manjih modifikacija 1990. prihvatila „Međunarodna organizacija za standardizaciju” (ISO) kao ISO/IEC 9899:1990. Ova verzija se ponekad naziva С90. Zbog toga se pojmovi „C89” i „C90” odnose na suštinski isti jezik.

ANSI C i ISO C uredi

Tokom kasnih 70-ih i 80-ih, verzije C-a su implementirane za različite mainframe računare, miniračunare i mikroračunare, uključujući IBM PC, tako da je njegova popularnost značajno porasla. Godine 1999. objavljen je standard ISO/IEC 9899:1999. Ovaj standard se često naziva С99. С99 uvodi nekoliko novih osobina, od kojih su mnoge već bile implementirane u nekoliko kompajlera:

  • linijske (engl. inline) funkcije
  • nekoliko novih tipova podataka, uključujući long long int, boolean tip podataka, complex tip podataka za predstavljanje kompleksnih brojeva
  • nizove promenljive veličine
  • nove funkcije standardne biblioteke, kao što je snprintf
  • podršku za komentare u jednoj liniji koji počinju znacima //
  • poboljšana podrška za IEEE 754 računanje u pokretnom zarezu — izračunavanje realnih brojeva može biti urađeno i sa jednostrukom tačnošću

C je nezavisan od konkretne arhitekture računarskog sistema. Standard čini sve aspekte prenosivosti eksplicitnim.

Podrška kompajlera uredi

GCC i drugi C kompajleri sada imaju podršku za mnoge nove osobine С99 standarda. Ipak, postoji slabija podrška proizvođača kao što su Majkrosoft i Borland koji su se uglavnom koncentrisali na С++, koji obezbeđuje slična funkcionalna poboljšanja.

Uprkos značajnoj podršci za C99, GCC nije potpuno saglasna implementacija standarda; nekoliko ključnih osobina nije implementirano ili ne rade korektno[1].

Prema tvrdnjama kompanije Sun Microsystems, Sun Studio (koji je besplatan za preuzimanje) sada podržava kompletni С99 standard[2].

Otkrivanje (detekcija) verzije uredi

Standardni makro __STDC_VERSION__ je definisan sa vrednošću 199901L koja ukazuje da je podržan C99 standard. Kao i __STDC__ makro za C90, __STDC_VERSION__ makro može biti korišćen da se napiše kod koji će se kompajlirati različito za С90 i С99 kompajlere. Primer: -{

#if __STDC_VERSION__ >= 199901L
  /* "inline" је кључна реч */
#else
# define inline /* ништа */
#endif

Primena uredi

Denis Riči je C originalno stvorio i primenio na UNIX operativnom sistemu na DEC-ovom PDP-11. Operativni sistem, C kompajler i svi UNIX-ovi aplikativni programi su napisani na C-u. Jezik se nakon svoje primarne upotrebe proširio na sve sfere programiranja. Proslavivši se svojom brzinom, postao je jezik izbora za mnoge buduće projekte, poput različitih verzija Windows-a i UNIX-a, ali i u aplikativnom programiranju za mnogobrojne primene tokom decenija. I danas se koristi u velikoj meri, prvenstveno za sistemsko programiranje. Još jedna posledica široke prihvaćenosti i efikasnosti C-a je ta da su kompajleri, biblioteke i interpretatori drugih programskih jezika visokog nivoa često napisani na C-u.

Organizacija jezika uredi

Organizacione celine C-a su funkcije. Početna tačka izvršavanja programa je tzv. „glavna funkcija” (engl. main), a celokupan program se organizuje u određeni broj drugih funkcija, u zavisnosti od potrebe. Funkcije se posmatraju odvojenim, izolovanim celinama čime se postiže modularnost koda koji je kao takav lak za održavanje i dalje razvijanje.

Svaka funkcija ima svoj imenski prostor i nema direktan pristup promenljivama drugih funkcija. Posredan pristup promenljivama drugih funkcija je obezbeđen mehanizmom pokazivača i argumenata funkcije.

Telo funkcije je ograničeno vitičastim zagradama, kako bi joj se označili početak i kraj. Unutar funkcija delovi koda mogu biti odvojeni u funkcijske podblokove.

Program se izvršava počev od prve linije koda funkcije main. Ona može pozivati druge funkcije ili samu sebe (vidi rekurzija). Po završetku funkcije main, čitav program se završava i oslobađa iz memorije.

Uz standardni C se distribuiraju i standardne biblioteke. To su datoteke koje sadrže mnoštvo korisnih alata koji se koriste u svakodnevnom radu. Programer može da uključi jednu ili više ovih biblioteka u svoj program, a može i sam da piše biblioteke za svoje potrebe.

C operatori uredi

C podržava bogat skup operatora. C ima aritmetičke operatore, operatore poređenja (relacijske), logičke, bitske (operatore za manipulisanje bitovima), operatore dodele, uvećanja i umanjenja za jedan, referenciranja i dereferenciranja, uslovni operator, operator promene tipa (konverzije)…

Оператор        Пример          Опис/Значење

(typecast)      (double)n       cast(оп. конверзије); У овом примеру конвертује вредност n у double

()              f()             Позив функције
 
[]              n[10]           Референца низа
 
->              s->x            Приступ одређеном члану структуре или уније
.               s.x             Приступ одређеном члану структуре или уније

+ [унарни]      +x              Вредност операнда x
- [унарни]      -x              Негативна вредност операнда x

* [унарни]      *x              Индирекција или дереферентни оператор
& [унарни]      &x              Операција адресирања;Адреса операнда x

++ [префикс]    ++x             Вредност операнда x после инкрементирања
++ [постфикс]   x++             Вредност операнда x пре инкрементирања
-- [префикс]    --x             Вредност операнда x после декрементирања
-- [постфикс]   x--             Вредност операнда x пре декрементирања

sizeof          sizeof (t1)     Величина операнда у бајтовима објекта типа t1
sizeof          sizeof e        Величина операнда у бајтовима објекта типа израза e
 
+ [бинарни]     x + y           x плус y
- [бинарни]     x - y           x минус y
* [бинарни]     x * y           x пута y
/               x / y           x подељено са y
%               x % y           Остатак при дељењу x/y

>>              x >> y          Померање садржаја операнда x за у битова удесно
<<              x << y          Померање садржаја операнда x за у битова улево

<               x< y            Оператор поређења- мање;1 ако је x< y; 0 иначе
>               x> y            Оператор поређења- веће;1 ако је x> y; 0 иначе
<=              x<= y           Оператор поређења- мање или једнако;1 ако је x <= y; 0 иначе
>=              x >= y          Оператор поређења- веће или једнако;1 ако је x >= y; 0 иначе
==              x == y          Оператор поређења- једнако;1 ако је x једнако y; 0 иначе
!=              x != y          Оператор поређења- различито;1 ако x није једнако y; 0 иначе

& [битски]      x & y           Битско AND над битовима операнада x и y
| [битски]      x | y           Битско OR над битовима операнада x и y
^ [битски]      x ^ y           Битско XOR (ексклузивно OR) над битовима операнада x и y
~               ~x              Комплементирање сваког бита операнда x

&&              x && y          Логичко AND над x и y ( даје вредност 0 или 1)
||              x || y          Логичко OR операнада x и y (даје вредност 0 или 1)
!               !x              Логичко NOT (логичка негација) операнда x (даје вредност 0 или 1)

?:              x ? e1 : e2     Условни оп.; Израз e1 ако x није нула (истинит је); иначе израз e2

=               x = y           Оператор придруживања; x, након што му је додељен у
+=              x += y          x плус y (додељено операнду x)
-=              x -= y          x минус y (додељено операнду x)
*=              x *= y          x пута y (додељено операнду x)
/=              x /= y          x подељено са y (додељено операнду x)
%=              x %= y          Остатак при дељењу x/y (додељено операнду x)
>>=             x >>= y         x, померен садржај операнда x за у битова удесно(додељено операнду x)
<<=             x <<= y         x, померен садржај операнда x за у битова улево(додељено операнду x)
&=              x &= y          x AND y (додељено операнду x)
|=              x |= y          x OR y (додељено операнду x)
^=              x ^= y          x XOR y (додељено операнду x)
,               e1,e2           e2 (прво се израчуна е1)

Prioritet i asocijativnost operatora:

Категорија       Оператор                              Асоцијативност

Постфикс         () [] -> . ++ --                      слева надесно
Унарни           ! ~ ++ -- + - * & (type) sizeof       здесна налево
Аритметички      * / %                                 слева надесно
Аритметички      + -                                   слева надесно
Померања         << >>                                 слева надесно
Релациони        < <= > >=                             слева надесно
Једнакости       == !=                                 слева надесно
Битски           AND  &                                слева надесно
Битски           XOR  ^                                слева надесно
Битски           OR  |                                 слева надесно
Логички          AND  &&                               слева надесно
Логички          OR  ||                                слева надесно
Условни          ?:                                    здесна налево
Доделе           = += -= *= /= %= >>= <<= &= ^= |=     здесна налево
Зарез            ,                                     слева надесно

Primeri uredi

Ovo je najmanji mogući C program.

main() {
}

Primer koji sledi je kratak Hello World program, napisan na programskom jeziku C. Ovaj primer je postao model za uvodni primer za mnoge programske jezike. Štampa poruku „Zdravo svete”.

#include <stdio.h>
/* укључујемо библиотеку која нам омогућава
   рад са тастатуром и екраном */

int main(void) { /* започињемо функцију main */
    printf("Zdravo svete\n");  /* користећи функцију printf из библиотеке
                                stdio.h, штампамо поруку на екран */
    return 0;                /* програм се завршава */
}

Svaki C program se sastoji iz funkcija i promenljivih. main funkcija je posebna — svaki program mora sadržati ovu funkciju jer se program izvršava od početka main funkcije.

Prva linija programa #include <stdio.h> je pretprocesorska direktiva koja govori da treba usvojiti informaciju o standardnoj ulazno-izlaznoj biblioteci. Korišćenjem oznaka /* */ smo ubacili komentare u program. main funkcija poziva printf funkciju iz standardne biblioteke, kojom se ispisuje poruka na ekran.

Kako funkcija printf posle završenog ispisa ne prelazi automatski u novi red, prethodni program možemo napisati i na sledeći način:

#include <stdio.h>
int main(void) {
    printf("Dobar ");
    printf("dan.");
    printf("\n");
    return 0;
}

Možemo primetiti da kada želimo da pređemo u novi red, koristimo posebni znak \n. Na kraju, naredbom return 0, main funkcija vraća vrednost nula u pozivni program.

Kontrolne strukture uredi

Program se izvršava instrukciju po instrukciju, počevši od prve a završavajući se poslednjom instrukcijom funkcije main. Program se može završiti i ranije, koristeći ključnu reč return ili bibliotečku funkciju exit. Pored imperativnih instrukcija, u programskom jeziku C postoje i instrukcije koje kontrolišu tok programa, tzv. kontrolne strukture. One se dele na grananja i petlje.

Grananje uredi

Pošto se program uvek poziva u drugačijem okruženju (drugačije vrednosti promenljivih, drugačiji sistem na kome se program izvršava, momenat izvršavanja i želje korisnika programa), postoji potreba da se u zavisnosti od određenih uslova izvrše različite instrukcije. Operacija grananja predstavlja instrukciju da se pod određenim uslovima izvrši jedan blok instrukcija, pod drugim uslovima drugi itd. Postoje dve načina implementiranja ovakvog ponašanja: koristeći kontrolnu strukturu if...else i koristeći kontrolnu strukturu switch.

if...else na engleskom jeziku znači „ako…u suprotnom”. Sledi primer:

if ( n < 10 ) {
    printf( "n је мање од 10" );
} else {
    printf( "n је веће или једнако 10" );
}

Ako je n u trenutku izvršavanja bilo manje od 10, biće odštampana samo prva poruka („n je manje od 10”). U suprotnom, ako je n bilo veće ili jednako 10, biće odštampana samo druga poruka.

switch se najčešće koristi kod višestrukih grananja, tj. u situacijama kada razlikujemo nekoliko uslova pod kojim se izvršavaju različite instrukcije. Sledi primer za ovu kontrolnu strukturu:

switch ( n ) {
    case 1: printf( "n је једнако један" );
            break;
    case 2: printf( "n је једнако два" );
            break;
    default: printf( "n није једнако ни један ни два" );
}

Petlje uredi

Petlje se koriste u situacijama kada je potrebno da se određeni deo koda izvršava više puta. Sastavni delovi petlje su uslov petlje i blok petlje — dok je uslov tačan, blok petlje se ponavlja. Kada zadati uslov postane netačan, ponavljanje se prekida i program nastavlja sa izvršavanjem. Postoje i petlje kod kojih se blok koda ponavlja sve dok je određeni uslov netačan. Kada postane tačan, ponavljanje se prekida. U programskom jeziku C postoje sledeće vrste petlji:

  • while petlja
  • do...while petlja
  • for petlja

Sintaksa while petlje:

while (izraz)
     iskaz;

U ovoj petlji se izračunava izraz. Ako vrednost izraza nije nula, iskaz se izvršava i izraz se ponovo izračunava. Ciklus se nastavlja sve dok izraz ne postane nula, a onda se izlazi iz ciklusa i izvršavanje se nastavlja posle iskaza.

Sintaksa do...while petlje:

do
  iskaz;
while (izraz);

Dok while i for petlje testiraju uslov na početku petlje, pa se može dogoditi da se iskaz ne izvrši nijednom, petlja do...while testira uslov posle prolaska kroz telo petlje, pa se iskaz bar jednom izvršava.

Sintaksa for petlje:

for(izraz1;izraz2;izraz3)
    iskaz;

Tri komponente ove petlje su izrazi. Najčešće su izraz1 i izraz3 pozivi funkcija ili dodeljivanja, a izraz2 je relacioni izraz. Bilo koji od ova tri dela može nedostajati, čak i sva tri. Gornja for petlja je ekvivalentna sa:

izraz1;
while (izraz2){
     iskaz;
     izraz3;
}

Sledi primer beskonačne petlje:

for(;;) {
    ...
}

Ova petlja može biti prekinuta npr. naredbama break ili return. Korišćenjem naredbe continue u for petlji preskače se trenutna iteracija petlje i prelazi se na sledeću, dok se u while petlji prelazi na ispitivanje uslova petlje.

Programski jezik C takođe sadrži naredbu goto koja predstavlja naredbu bezuslovnog skoka. Sintaksa ove naredbe je:

goto labela;
...
labela: naredba;

U ovom primeru, labela predstavlja oznaku naredbe na koju se skače korišćenjem naredbe goto. Naredbe koje se nalaze između labela i goto se preskaču, ili će se potencijalno ponovo izvršiti ako se labela u kodu nalazi pre naredbe goto. Iako ova naredba može biti korisna u jednostavnim zadacima i ukoliko je potrebno izaći iz ugneždenih petlji, uglavnom se izbegava njeno korišćenje u praksi. Razlog za to je nepreglednost programa napisanih pomoću ove komande i njihovo teško prepravljanje.

Vrste promenljivih uredi

Poseban članak: promenljiva.

U programskom jeziku C, tipovi promenljivih se dele na sledeće:

  • elementarni tipovi
  • nizovi
  • tipovi koje definiše korisnik i
  • pokazivačke promenljive

Elementarni tipovi uredi

Elementarni tipovi promenljivih se dele po različitim kriterijumima. Po vrsti podataka koje čuvaju dele se na sledeće:

  • celobrojne (označavaju se ključnom rečju int)
  • znakovne (char)
  • realne (označavaju se ključnim rečima float — realni brojevi u pokretnom zarezu sa jednostrukom tačnošću i double — realni brojevi u pokretnom zarezu sa dvostrukom tačnošću)

Po količini memorije koju zauzimaju, a samim tim i po rasponu vrednosti, dele se na:

  • kratke (označavaju se ključnom rečju short) i
  • duge (long)

Po mogućnosti postojanja negativnih vrednosti, dele se na sledeće:

  • označene (ključna reč signed, koja se ne mora pisati jer se podrazumeva) i
  • neoznačene (ključna reč unsigned)

Ključne reči za označavanje tipova se mogu kombinovati, u zavisnosti od toga kojoj grupi, prema različitim kriterijumima, tip promenljive pripada. signed i unsigned mogu biti pridruženi celobrojnom i znakovnom tipu. Tako, jedna promenljiva x može biti celobrojna po vrsti podataka, duga po veličini memorije i neoznačena po mogućnosti postojanja negativnih vrednosti; u tom slučaju bi se označavala na sledeći način:

unsigned long int x;

Reč int se može izostaviti u deklaracijama ovog tipa.

Najveće i najmanje vrednosti promenljivih određenog tipa zavise od računara. Zato postoje sistemska zaglavlja <limits.h> i <float.h> i kojima su definisane granične vrednosti.

Nizovi uredi

Nizovi predstavljaju složene tipove podataka, i baziraju se na ostalim tipovima promenljivih. Nizovi predstavljaju skupine elemenata istog tipa obeležene jednim imenom. Niz u C-u je uvek jednodimenzionalan i, tradicionalno, fiksne, statičke veličine definisane u vreme kompilacije. (noviji S90 standard takođe dopušta i nizove promenljive dužine.) Ipak, korišćenjem malloc funkcije iz standardne biblioteke, moguće je alocirati blok memorije u vreme izvršavanja programa. Za dinamičku alokaciju memorije može se koristiti i funkcija calloc. Memoriju alociranu ovim funkcijama neophodno je osloboditi (dealocirati) funkcijom free.

Svakom elementu niza se može pristupiti preko njegovog celobrojnog indeksa, odnosno rednog broja u nizu. Indeksi počinju rednim brojem 0. Sledi primer deklaracije i korišćenja niza celih brojeva:

int niz[40]; /* декларишемо статички низ величине 40 */
int x;
x = niz[0]; /* променљивој x додељујемо вредност првог елемента низа */

Mogu se napraviti nizovi promenljivih bilo kog tipa, uključujući sve tipove iz nabrojane liste tipova promenljivih, ali svi elementi u jednom nizu moraju biti istog tipa.

Karakterističnost C-a je i njegov odnos prema nizovima i pokazivačima. Nizovi se u C-u implementiraju preko pokazivača. Zapis x[i] može takođe biti korišćen kada je x pokazivač; tada ovaj zapis označava da se pristupa od nekoliko uzastopnih objekata podataka na koje pokazuje x, gde je objekat na koji pokazuje x (to je x[0]) prvi element niza.

Formalno, x[i] je isto što i *(x+i). Kako je kompajleru u vreme kompajliranja poznat tip pokazivača koji se koristi, adresa na koju pokazuje x+i nije adresa na koju pokazuje x uvećana za i bajtova, već uvećana za i pomnoženo veličinom elementa na koji pokazuje. Veličina ovih elemenata može biti određena operatorom sizeof.

Sledi zanimljiva demonstracija mogućnosti uzajamne zamene pokazivača i nizova. Četiri dodele su ekvivalentne i svaka predstavlja tačan C kod. Primetimo da poslednja linija sadrži čudan kod koji ima naizgled zamenjen položaj indeksne promenljive i i nizovne promenljive n.

x[i]=1;
*(x+i)=1;
*(i+x)=1;
i[x]=1; /* чудно, али тачно: -{i[x]}- је еквивалентно -{*(i+x)}-*/

Ipak, moramo napraviti razliku između nizovnih i pokazivačkih promenljivih. Iako se ime niza u većini izraza konvertuje u pokazivač (na njegov prvi element), ovaj pokazivač sam po sebi ne zauzima memorijski prostor. Dakle, ne može se promeniti ono na šta niz pokazuje, i nemoguće je dodeliti ga nizu. (Nizovi se ipak mogu kopirati korišćenjem funkcije memcpy, na primer.)

Tipovi koje definiše korisnik uredi

Korisnik definiše svoje tipove koristeći ključnu reč struct, i takvi tipovi se nazivaju strukturama. Svaka struktura zapravo predstavlja skup jedne ili više promenljivih čiji tip takođe mora biti jedan od tri nabrojana (elementarni, korisnički ili pokazivački). Strukture imaju sve mogućnosti kao elementarni tipovi, osim mogućnosti korišćenja operatora +, -, *, /, %, &, &&, |, ||, <, >, <<, >>, !, != i ?:, kao ni njihovih derivata +=, -=, ++, --, *=, >>=, itd. Operator dodele (=) je moguć, ali se dodela vrši „bajt po bajt”, što u slučaju dinamičke memorije nije dovoljno. Takođe, strukture uvode i još dva operatora: tačku — operator za pristup pojedinačnim elementima strukture (.) i „strelicu” — operator za pristup elementima strukture preko pokazivača na strukturu (strelica se zapravo sastoji od znaka minusa i znaka veće — ->).

Strukture, poput elementarnih tipova, mogu biti prosleđivane kao argumenti funkcija, mogu biti merene operatorom sizeof, biti odredište pokazivača itd. Sledi primer deklaracija i korišćenja strukture koja sadrži godine, pol, stručnu spremu i ime i prezime radnika:

/* дефинишемо тип Radnik */
struct Radnik {
    short int godine; /* године се представљају целобројном вредношћу, и због малог
                         опсега вредности их ограничавамо кључном речју short */
    char pol; /* пол може бити мушки и женски, па ћемо их обележавати знаковима ‘m’ и ‘z’ */
    char str_sprema[30], ime_i_prezime[40]; /* стручну спрему и име и презиме представљамо
                                               низовима знаковних променљивих од по тридесет
                                               и четрдесет елемената, тим редом */
};

/* декларишемо променљиву r типа struct Radnik */
struct Radnik r;

/* додељујемо вредности припадајућим елементима структуре */
r.godine = 44;
r.pol = 'm';
strcpy( r.str_sprema, "Srednja strucna sprema" );
strcpy( r.ime_i_prezime, "Petar Petrovic" );

/* исписујемо податке о раднику */
printf( "%s \"%s\" ima %d godina, i ima strucnu spremu \"%s\"",
    r.pol=='m'?"Radnik":"Radnica", r.ime_i_prezime, r.godine, r.str_sprema );

Pokazivačke promenljive uredi

Poseban članak: pokazivač.

Svaka promenljiva deklarisana u programskom jeziku C ima svoju memorijsku adresu. Tu adresu možemo dobiti unarnim operatorom &. Operator & se odnosi samo na objekte u memoriji — promenljive i elemente polja. Ne može se primeniti na izraze, konstante ili register promenljive. Pokazivačke promenljive predstavljaju specijalan tip promenljivih koje imaju za osnovnu svrhu da čuvaju vrednost adrese drugih promenljivih u programu (tj. pokazivač je promenljiva koja sadrži adresu druge promenljive). Pokazivačke promenljive se dele prema tipu promenljivih čije adrese čuva odnosno na koje pokazuje. Tako, mogu postojati celobrojni pokazivači (odnosno pokazivači na celobrojne promenljive), realni, strukturni itd. Svaki pokazivač mora da pokazuje na određenu vrstu objekta. Izuzetak je „pokazivač na void”.

Pokazivači se u programskom jeziku C označavaju znakom zvezdice (*), kako pri deklaraciji, tako i pri pristupu vrednostima na koje pokazuju. Unarni operator * je indirekcija ili dereferentni operator. Kada se primeni na pokazivač, on pristupa objektu na koji pokazivač ukazuje. Sledi primer deklaracije celobrojne vrednosti n, pokazivačke promenljive np koja pokazuje na n i korišćenja:

int n = 2; /* декларација целобројне променљиве n са вредношћу 2 */
int *np; /* декларација показивача np који може да показује само на целобројне променљиве */
np = &n; /* додела адресе променљиве n показивачу np */
printf( "%d", *np ); /* штампање вредности променљиве n користећи показивач np */

Upravljanje memorijom uredi

Jedna od najbitnijih funkcija programskog jezika je da obezbedi mogućnost rukovanja memorijom i objektima koji su sačuvani u memoriji. C obezbeđuje tri različita načina da se alocira (dodeli, rezerviše) memorija za objekte:

  • Statička alokacija memorije
  • Automatska alokacija memorije
  • Dinamička alokacija memorije

Svaki od ova tri prilaza predstavlja odgovarajuće rešenje u različitim situacijama i ima mnogobrojne primene.

Kada je to moguće, automatska ili statička alokacija su poželjnije jer je upravljanje memorijom ostavljeno kompajleru, što oslobađa programera od mogućnosti da napravi grešku pri alociranju i oslobađanju memorije. Ipak, mnoge strukture podataka se uvećavaju tokom izvršavanja programa, i kako statička alokacija (i automatska alokacija u S89 i S90 standardima) treba da imaju fiksiranu veličinu u vreme kompajliranja, postoje mnoge situacije u kojima je neophodna dinamička alokacija.

Ključne reči uredi

Jedan broj reči, tzv. ključne reči, imaju posebno značenje u jeziku i zato se ne mogu koristiti kao identifikatori. Ključne reči prema C90 standardu su:

auto      extern    sizeof
break     float     static
case      for       struct
char      goto      switch
const     if        typedef
continue  int       union
default   long      unsigned
do        register  void
double    return    volatile
else      short     while
enum      signed

Standard C99 je uveo i sledeće ključne reči[3]:

inline    _Bool      _Imaginary
restrict  _Complex

U određenim verzijama jezika postoje i sledeće (nestandardne) ključne reči:

ada       far       near
asm       fortran   pascal
entry     huge

Imena koja počinju znakom _ treba izbegavati jer su rezervisana za promenljive i funkcije iz standardne biblioteke.

Biblioteke uredi

Programski jezik C koristi biblioteke kao osnovni način proširivanja svoje funkcionalnosti. U C-u, biblioteka je skup funkcija. Svaka biblioteka obično ima zaglavlje (header file), koje sadrži prototipove funkcija, sadržanih u biblioteci, koje može da koristi program, i deklaraciju specijalnih tipova podataka i makroa koje koriste ove funkcije. Da bi program koristio biblioteku, mora da uključi zaglavlje biblioteke, i biblioteka mora biti povezana (linked) sa programom.

Najpoznatija C biblioteka je C standardna biblioteka, koja je određena ISO i ANSI C standardima i uključena je u svaku C implementaciju. Funkcije, tipovi i makroi standardne biblioteke su deklarisani u standardnim zaglavljima:

<assert.h>    <ctype.h>    <errno.h>    <float.h>    <limits.h>    <locale.h>
<math.h>      <setjmp.h>   <signal.h>   <stdarg.h>   <stddef.h>    <stdio.h>
<stdlib.h>    <string.h>   <time.h>

Nova zaglavlja koja je uključio standard C99 su:

<complex.h>   <fenv.h>     <inttypes.h>
<stdbool.h>   <stdint.h>   <tgmath.h>

Zaglavlju možemo pristupiti na sledeći način: #include<заглавље>

Još jedan poznat skup C bibliotečnih funkcija je onaj namenjen programima koje rade pod UNIX-om, posebno funkcija koje obezbeđuju interfejs sa kernelom. Ove funkcije su opisane u različitim standardima kao što su POSIX i Single UNIX Specification.

Kako postoji veliki broj programa napisanih u C-u, postoji veliki broj dostupnih biblioteka. Biblioteke su često napisane na C-u zato što C kompajleri generišu efikasan objektni kod.

Uticaj uredi

Sintaksa C-a je imala veliki uticaj na veliki broj programskih jezika koji su nastajali posle njega. Tako, danas postoje sledeći programski jezici koji su, posredno ili neposredno, preuzeli sintaksu od C-a:

Često se zbog toga kaže da je C „pobedio” u programerskom svetu, pri čemu se misli na Paskal, Kobol i druge kako proceduralne tako i neproceduralne programske jezike u vreme njegovog nastanka. Ovakav epitet C duguje svojoj arhitekturi koja omogućava veliku brzinu programa, ali i velikim novinama koje je uveo u svet programiranja što se tiče kratkoće koda (operatori ++, --, vitičaste zagrade za ograničavanje bloka za razliku od Paskalovih ključnih reči BEGIN i END itd.), intenzivne upotrebe pokazivača itd.

Vidi još uredi

Reference uredi

  1. ^ „Status of C99 features in GCC”. Free Software Foundation, Inc. 22. novembar 2007. Pristupljeno 9. januar 2008. 
  2. ^ „Sun Studio 12: C Compiler 5.9 Readme”. Sun Microsystems, Inc. 31. maj 2007. Pristupljeno 9. januar 2008. 
  3. ^ „Podržane karakteristike C99, sun.com”. Arhivirano iz originala 11. 05. 2008. g. Pristupljeno 16. 05. 2008. 

Literatura uredi

Spoljašnje veze uredi