Programski jezik C
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

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

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
Ovaj materijal je namenjen za učenje i pripremu, ne za predaju.
Slični dokumenti