Dennis M. Ritchie 

Brian W. Kernighan 

 
 
 
 
 
 
 
 
 
 
 

Programski jezik C 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Drugo izdanje 

Prijevod: Ante Denić 

 

Programski jezik C 

Sadržaj 

 

 

Predgovor------------------------------------------------------------------------------------------------------3

 

Predgovor prvom izdanju-----------------------------------------------------------------------------------4

 

UVOD-----------------------------------------------------------------------------------------------------------5

 

1.1 Puštanje u rad-----------------------------------------------------------------------------------------7

 

1.4 Simboličke konstante------------------------------------------------------------------------------13

 

1.5 Znakovni ulaz i izlaz -------------------------------------------------------------------------------13

 

1.5.1 Kopiranje datoteka-----------------------------------------------------------------------------14

 

1.5.3 Brojanje linija ------------------------------------------------------------------------------------16

 

1.5.4 Brojanje riječi------------------------------------------------------------------------------------16

 

1.6 Polja ---------------------------------------------------------------------------------------------------17

 

1.7 Funkcije----------------------------------------------------------------------------------------------- 19

 

1.8 Argumenti - pozivanje pomoću vrijednosti----------------------------------------------------21

 

1.9 Polja znakova ---------------------------------------------------------------------------------------22

 

1.10 Vanjske varijable i područja --------------------------------------------------------------------24

 

POGLAVLJE 2: TIPOVI, OPERATORI I IZRAZI----------------------------------------------------27

 

2.1 Imena varijabli--------------------------------------------------------------------------------------- 27

 

2.2 Tipovi i veličine podataka-------------------------------------------------------------------------27

 

2.3 Konstante --------------------------------------------------------------------------------------------28

 

2.4 Deklaracije -------------------------------------------------------------------------------------------30

 

2.5 Aritmetički operatori--------------------------------------------------------------------------------31

 

2.6 Relacijski i logički operatori ---------------------------------------------------------------------- 31

 

2.7 Konverzije tipova ----------------------------------------------------------------------------------- 32

 

2.8 Operatori uvećavanja i umanjivanja (inkrementiranja i dekrementiranja) ------------- 34

 

2.9 Operatori za manipulaciju bitovima ------------------------------------------------------------36

 

2.10 Operatori i izrazi dodjeljivanja vrijednosti ---------------------------------------------------37

 

2.11 Uvjetni izrazi ---------------------------------------------------------------------------------------38

 

2.12 Prioritet i redoslijed računanja -----------------------------------------------------------------39

 

POGLAVLJE 3: KONTROLA TOKA -------------------------------------------------------------------41

 

3.1 Naredbe i blokovi-----------------------------------------------------------------------------------41

 

3.2 If – else ----------------------------------------------------------------------------------------------- 41

 

3.3 Else – if ----------------------------------------------------------------------------------------------- 42

 

3.4 Switch------------------------------------------------------------------------------------------------- 43

 

3.5 Petlje - while i for ----------------------------------------------------------------------------------- 44

 

background image

Programski jezik C 

Sadržaj 

 

 

6.3 Polja struktura---------------------------------------------------------------------------------------98

 

6.4 Pokazivači na strukture ------------------------------------------------------------------------- 101

 

6.5 Samopozivajuće strukture---------------------------------------------------------------------- 102

 

6.6 Pretraživanje tablice ----------------------------------------------------------------------------- 106

 

6.7 Typedef --------------------------------------------------------------------------------------------- 108

 

6.8 Unije------------------------------------------------------------------------------------------------- 109

 

6.9 Polja bitova ---------------------------------------------------------------------------------------- 110

 

POGLAVLJE 7: ULAZ I IZLAZ ------------------------------------------------------------------------ 112

 

7.1 Standardni ulaz i izlaz --------------------------------------------------------------------------- 112

 

7.2 Formatirani izlaz - printf------------------------------------------------------------------------- 113

 

7.3 Liste argumenata promjenjive dužine ------------------------------------------------------- 115

 

7.4 Formatirani ulaz - scanf------------------------------------------------------------------------- 116

 

7.5 Pristup datoteci ----------------------------------------------------------------------------------- 118

 

7.6 Manipulacija greškama - stderr i exit -------------------------------------------------------- 120

 

7.7 Linijski ulaz i izlaz -------------------------------------------------------------------------------- 121

 

7.8 Raznolike funkcije-------------------------------------------------------------------------------- 122

 

7.8.1 Operacije s znakovnim nizovima --------------------------------------------------------- 122

 

7.8.2 Provjera i pretvorba klasa znakova ------------------------------------------------------ 122

 

7.8.3 Funkcija ungetc------------------------------------------------------------------------------- 123

 

7.8.4 Izvršenje naredbe ---------------------------------------------------------------------------- 123

 

7.8.5 Upravljanje memorijom --------------------------------------------------------------------- 123

 

7.8.6 Matematičke funkcije------------------------------------------------------------------------ 124

 

7.8.7 Generiranje slučajnih brojeva ------------------------------------------------------------- 124

 

POGLAVLJE 8: SUČELJE UNIX SISTEMA ------------------------------------------------------- 125

 

8.1 Deskriptori datoteka ----------------------------------------------------------------------------- 125

 

8.2 Primitivni U/I - read i write ---------------------------------------------------------------------- 125

 

8.3 open, creat, close, unlink ----------------------------------------------------------------------- 126

 

8.4 Slučajan pristup - lseek ------------------------------------------------------------------------- 128

 

8.5 Primjer - Implementacija funkcija fopen i getc --------------------------------------------- 129

 

8.6 Primjer - Listanje direktorija-------------------------------------------------------------------- 132

 

8.7 Primjer - Pridjeljivač memorije----------------------------------------------------------------- 136

 

Programski jezik C 

Predgovor 

 

 

3

Predgovor 

 

Od izdavanja "Programskog jezika C" 1978. godine, svijet ra

č

unala doživio je veliki napredak. Veliki 

ra

č

unalni sustavi postali su još snažniji, a osobna ra

č

unala dobila su mogu

ć

nosti koje se do desetak godina 

nisu mogle nazrijeti. Za to vrijeme i sam C se mijenjao, mada neznatno, i razvijao sve dalje od svojih 
za

č

etaka kao jezika UNIX operativnog sistema. 

 Rastu

ć

a popularnost C-a, promjene u jeziku tokom godina i kreiranje prevoditelja od strane onih 

kojima nije bitan izgled, kombinirano je s potrebom za preciznijom i suvremenijom definicijom jezika od one 
koja je bila prezentirana u prvom izdanju ove knjige. Godine 1983. American National Standard Institute 
(ANSI) zasniva udrugu 

č

ija je svrha bila napraviti "nedvosmislenu i od ra

č

unala nezavisnu definiciju C 

jezika". Rezultat svega je ANSI standard za C. 
 

Standard formalizira konstrukcije koje su bile najavljene, ali ne i opisane u prvom izdanju, kao što su 

dodjela strukture i nizovi dobiveni pobrojavanjem. Standard odre

đ

uje novi na

č

in deklariranja funkcije koji 

omogu

ć

uje provjeru definicije u praksi. Odre

đ

uje, tako

đ

er i standardnu biblioteku, s proširenim skupom 

funkcija za pripremu ulaza i izlaza, upravljanje memorijom, rad s nizovima i sl. Standard precizira vladanja 
atributa koji nisu bili u originalnoj definiciji i istovremeno jasno pokazuje koji su aspekti jezika ostali zavisni o 
ra

č

unalu. 

 

Drugo izdanje "Programskog jezika C" opisuje C onako kako ga definira ANSI standard (Za vrijeme 

pisanja ove knjige, standard je bio u završnom stadiju usvajanja; o

č

ekivalo se da bude usvojen krajem 

1988.god. Razlike izme

đ

u onoga što piše ovdje i kona

č

ne forme standarda su minimalne.). Iako smo 

nazna

č

ili mjesta na kojima se jezik proširio i razvio, odlu

č

ili smo ga ekskluzivno predstaviti u novom obliku. 

U velikom dijelu razlike su neznatne; najuo

č

ljivija izmjena je novi na

č

in deklaracije i definicije funkcije. 

Moderni prevoditelji ve

ć

 podržavaju najve

ć

i dio standarda. 

 

Pokušali smo zadržati suštinu prvog izdanja. C nije opširan jezik, pa ga nije potrebno opisivati 

opširnim knjigama. Doradili smo predstavljanje kriti

č

nih faktora kao što su pokaziva

č

i, koji su suština C 

programiranja. Pro

č

istili smo originalne primjere i dodali nove, u ve

ć

ini poglavlja. Na primjer, dio koji opisuje 

komplicirane deklaracije proširen je programima koji pretvaraju deklaracije u rije

č

i i obratno. Kao i u 

prethodnom slu

č

aju i ovdje su svi primjeri provjereni direktno iz teksta, prepoznatljivog ra

č

unalu. 

 

Dodatak A, uputa za rad, nije standard ve

ć

 samo pokušaj prikazivanja njegove suštine u kra

ć

em 

obliku. Poradi lakšeg razumijevanja vrlo je zna

č

ajno da posebna uloga pripadne samom standardu. Dodatak 

B predstavlja pregled karakteristika standardne biblioteke. Ovo je bitna napomena za programera, a ne za 
korisnika. Dodatak C pruža kratak pregled izmjena u odnosu na originalno izdanje. 
 

Kao što smo rekli u predgovoru prvom izdanju, C je "korisniji što je ve

ć

e iskustvo u radu s njim". 

Poslije desetogodišnjeg iskustva, to i dalje tvrdimo. Nadamo se da 

ć

e vam ova knjiga pomo

ć

i da nau

č

ite i 

primijenite programski jezik C. 
 

Jako su nas zadužili prijatelji koji su pomogli pri radu na drugom izdanju. Jon Bentley, Doug Gwyn, 

Doug McIlroy, Peter Nelson i Rob Pike komentirali suoriginalni rukopis. Zahvaljujemo Alu Ahou, Dennisu 
Allisonu, Joeu Campbellu, G. R. Emlinu, Karen Fortgang, Allenu Holubu, Andrewu Humeu, Daveu Kristolu, 
Johnu Lindermanu, Davidu Prosseru, Gene Spafford i Chrisu Van Wyku na pažljivoj kontroli napisanog 
teksta. Svojim primjedbama pomogli su nam i Bill Chestwick, Mark Kernighan, Andy Koenig, Robin Lake, 
Tom London, Jim Reeds, Clovis Tondo i Peter Weinberger. Dave Prosser je detaljno odgovorio na mnoga 
pitanja glede ANSI standarda. Koristili smo Bjarne Stroustrupov C++ translator za lokalno testiranje naših 
programa, a Dave Kristol nam je nabavio C prevoditelj kojim su obavljena završna testiranja. Rich Drechsler 
nam je mnogo pomogao pri pisanju teksta na ra

č

unalu. Svima im iskreno zahvaljujemo. 

 

 

 

 

 

Brian W. Kernighan 

 

 

 

 

 

Dennis M. Ritchie

background image

Programski jezik C 

Uvod 

 

 

5

UVOD 

 

C je programski jezik op

ć

e namjene. Tijesno je povezan s operativnim sistemom UNIX na kojemu je 

razvijen, jer su i sistem i ve

ć

ina programa koji rade na UNIX-u napisani baš u C-u. Jezik, ipak, nije vezan 

samo za jedan operativni sistem ili ra

č

unalo; iako je nazvan "jezikom za sistemsko programiranje" zato što 

se koristi pri pisanju prevoditelja i operativnih sistema, podjednako se dobro koristi za programiranje u 
drugim podru

č

jima. Ve

ć

ina bitnih ideja C-a potje

č

e od jezika BCPL koji je razvio Martin Richards. Utjecaj 

BCPL-a na C ostvaren je indirektno preko B jezika koji je 1970. napisao Ken Thompson za prvi UNIX sistem 
na DEC PDP-7 ra

č

unalu. 

 

BCPL i B su jezici bez "tipova podataka". Nasuprot njemu, C nudi mnoštvo razli

č

itih tipova podataka. 

Osnovni tipovi su znaci, cjelobrojne vrijednosti i vrijednosti iz podru

č

ja realnih brojeva (vrijednosti s 

pomi

č

nim zarezom) u više veli

č

ina. Uz to postoji hijerarhija izvedenih tipova podataka kreiranih 

pokaziva

č

ima, poljima, strukturama i unijama. Izrazi se sastoje od operatora i operanda; bilo koji izraz, 

uklju

č

uju

ć

i i dodjelu vrijednosti ili pozivanje funkcije, može biti naredba. Pokaziva

č

i omogu

ć

uju nezavisnu 

adresnu aritmetiku. 
 

C nudi osnovne konstrukcije za kontrolu toka koje traže dobro strukturirani programi: grupiranje 

naredbi, donošenje odluka (if-else), izbor (switch), petlje s uvjetima na po

č

etku (while) i na kraju (do), te izlaz 

iz petlje prije kraja (break). 
 

Funkcije mogu vra

ć

ati vrijednosti osnovnih tipova, struktura, unija ili pokaziva

č

a. Bilo koja funkcija 

može se rekurzivno pozivati. Lokalne varijable su tipi

č

no "automatske" (gube vrijednost pri izlasku iz 

funkcije) ili se kreiraju svakim novim pozivanjem. Definicije funkcija ne moraju se umetati, a varijable se 
mogu deklarirati u blokovima. Funkcije C programa mogu se nalaziti u razli

č

itim izvornim datotekama koje 

se posebno prevode. Varijable mogu biti unutrašnje, vanjske (za koje se zna samo unutar jedne izvorne 
datoteke) ili dostupne cijelom programu (globalne). 
 

Preprocesorska faza obavlja makrosupstitucije na izvornom tekstu programa, uklju

č

ivanje ostalih 

izvornih datoteka i uvjetno prevo

đ

enje. 

 

C je jezik relativno "niskog nivoa". Ovakav epitet nije nedostatak, ve

ć

 govori da C radi s istim 

vrstama objekata s kojima rade i sama ra

č

unala, a to su znakovi, brojevi i adrese. Ovi objekti se mogu 

kombinirati i premještati pomo

ć

u aritmeti

č

kih i logi

č

kih operatora kojima su opremljena postoje

ć

a ra

č

unala.  

 

C ne radi direktno sa složenim objektima kao što su nizovi znakova, skupovi, liste ili matrice. Ne 

postoje operacije koje obra

đ

uju cijelu matricu ili niz, iako strukture mogu biti kopirane kao jedinka. C ne 

definira ni jednu drugu mogu

ć

nost memoriranja lokacija osim stati

č

ke definicije i discipline stoga, koja je 

omogu

ć

ena lokalnim varijablama funkcija; ovdje nema nagomilavanja ili skupljanja nebitnih elemenata. Na 

kraju, sam C ne nudi ulazno/izlazne olakšice; u njemu ne postoje READ ili WRITE stanja, te nema 
ugra

đ

enih metoda za pristup datotekama. Svi ovi mehanizmi "višeg nivoa" moraju biti odre

đ

eni funkcijama 

koje se zovu eksplicitno. Manje-više sve implementacije C-a imaju standardnu kolekciju takovih funkcija. 
 

Shodno tomu, C zapravo nudi samo jednozna

č

ni kontrolni tok: uvjeta, petlji, grupiranja i 

potprograma, ali ne i multiprogramiranje, paralelne operacije ili sinkronizaciju. 
 

Iako nepostojanje neke od ovih karakteristika može izgledati kao ozbiljan nedostatak ("Zna

č

i da bih 

usporedio dva znakovna niza moram pozivati funkciju?"), održavanje jezika na umjerenoj razini ima svoju 
stvarnu korist. Pošto je C relativno mali jezik, dade se opisati na relativno malo prostora i nau

č

iti brzo. 

Programer s punim pravom može o

č

ekivati lako u

č

enje i razumijevanje korektne upotrebe cijelog jezika. 

 

Dugi niz godina, jedina definicija C-a je bio referentni priru

č

nik prvog izdanja ove knjige. American 

National Standards Institute (ANSI) je 1983.god. osnovao udrugu koja se skrbila za modernu i cjelovitu 
definiciju C-a. O

č

ekuje se da 

ć

e ANSI standard, ili ANSI C biti odobren u 1988.god. (odobren je op.prev). 

Sve karakteristike standarda ve

ć

 su podržane preko novih prevoditelja. 

 

Standard se bazira na originalnom referentnom priru

č

niku. Jezik je razmjerno malo mijenjan; jedan 

od ciljeva standarda je bio osigurati da ve

ć

ina postoje

ć

ih programa ostane primjenjiva, ili, ako to ne uspije, 

prevoditelji moraju dati upozorenje o druga

č

ijem na

č

inu rada. 

 Za 

ve

ć

inu programera, najbitnija promjena je u novoj sintaksi za deklariranje i definiranje funkcija. 

Deklaracija funkcije može sada imati opis argumenata funkcije; sintaksa definicije je na odre

đ

en na

č

in 

izmijenjena. Ova dodatna informacija pomaže da prevoditelji mnogo lakše otkrivaju greške nastale 
neslaganjem argumenata; po našem iskustvu, to je vrlo koristan dodatak jeziku. 
 

Postoje i još neke, manje izmjene. Dodjela struktura i nizova dobivenih pobrojavanjem, koji su se 

naširoko primjenjivali, postali su i zvani

č

no dio jezika. Izra

č

unavanje realnih brojeva može se obaviti i 

jednostrukom to

č

noš

ć

u. Aritmeti

č

ka svojstva, posebice za neozna

č

ene tipove su razjašnjena. Preprocesor 

je savršeniji. Ve

ć

ina od ovih promjena ipak ne

ć

e previše zanimati programere. 

 Drugi 

zna

č

ajan doprinos standarda je definicija biblioteke koja prati C jezik. Ona odre

đ

uje funkcije za 

pristup operativnom sistemu (npr. za 

č

itanje i pisanje datoteka), formatira ulaz i izlaz, odre

đ

uje položaj u 

memoriji, radi s nizovima i sl. Zbirka standardnih zaglavlja osigurava jednozna

č

an pristup deklaracijama 

Želiš da pročitaš svih 141 strana?

Prijavi se i preuzmi ceo dokument.

Ovaj materijal je namenjen za učenje i pripremu, ne za predaju.

Slični dokumenti