b'\n_START_ARTICLE_\nProgramski jezik C\n_START_SECTION_\nZasnova\n_START_PARAGRAPH_\nC je imperativni (proceduralni) jezik. Izdelan je bil za prevajanje na relativno preprostem prevajalniku in da bi zagotavljal nizkonivojski dostop do pomnilnika, jezikovne konstrukte, ki bi se u\xc4\x8dinkovito preslikali v tipi\xc4\x8dne strojne ukaze in, da bi potreboval najmanj\xc5\xa1o podporo izvajanja. Zaradi tega se C za\xc4\x8del rabiti v mnogih aplikacijah, ki so bile prej razvite z zbirnem jeziku, \xc5\xa1e posebej v sistemskem programiranju._NEWLINE_Navkljub svojim nizkonivojskim zmo\xc5\xbenostim se je jezik C razvil v smislu bolj\xc5\xa1ega programiranja na mnogih platformah. Program zapisan v C, ki je v skladu s standardom in napisan prenosljivo, se lahko prevede za zelo \xc5\xa1irok nabor ra\xc4\x8dunalni\xc5\xa1kih platform in operacijskih sistemov z zelo malo spremembami v izvorni kodi. Tako je C postal razpolo\xc5\xbeljiv na mnogih platformah od vgrajenih mikrokrmilnikov do superra\xc4\x8dunalnikov._NEWLINE_C velja za u\xc4\x8dinkovit jezik in je primeren za sistemska opravila, ni pa najprimernej\xc5\xa1i za u\xc4\x8denje programiranja, \xc4\x8deprav se pogosto pojavlja v izobra\xc5\xbeevanju. Je tudi eden od najbolj raz\xc5\xa1irjenih programskih jezikov, skupaj z javo, C++ ali PHP, od leta 2008 pa mu priljubljenost celo rahlo nara\xc5\xa1\xc4\x8da. Obstaja zelo malo arhitektur in operacijskih sistemov za katere ni na voljo prevajalnika za C. C se veliko rabi tudi za razvoj prenosljivega uporabni\xc5\xa1kega programja.\n_START_SECTION_\nPovezave z drugimi jeziki\n_START_PARAGRAPH_\nRazvoj jezika C je zelo vplival na druge programske jezike, \xc5\xa1e posebej na C++, ki se je razvil kot raz\xc5\xa1iritev C-ja. Mnogo kasnej\xc5\xa1ih jezikov si je neposredno ali posredno sposodilo dolo\xc4\x8dene gradnike C-ja, na primer: D, Go, Rust, java, JavaScript, Limbo, LPC, C#, Objective-C, Perl, PHP, Python, Swift, Vala, Verilog (strojni opisni jezik), in Unixova C shell. Ti jeziki so dobili mnogo svojih nadzornih struktur in drugih osnovnih gradnikov od C-ja. Ve\xc4\x8dina od njih, kjer je Python najve\xc4\x8dja izjema, je tudi skladenjsko zelo podobnih C-ju v splo\xc5\xa1nem in so usmerjeni na zdru\xc5\xbeevanje prepoznavnih izrazov in stavkov skladnje jezika C z osnovo sistemov tipa, podatkovnih modelov in semantiko, ki je lahko popolnoma druga\xc4\x8dna. Skladnja pri teh jezikih v\xc4\x8dasih vklju\xc4\x8duje tudi enakovredne preproste nadzorne strukture. C++ in Objective-C sta bila na za\xc4\x8detku jezika prevajalnikov, ki so tvorila kodo v C. C++ je trenutno skoraj supermno\xc5\xbeica C, Objective-C pa je stroga supermno\xc5\xbeica C. C se rabi tudi kot posredni jezik za druge jezike ter za ustvarjanje standardnih knji\xc5\xbenic in izvajalnih sistemov za vi\xc5\xa1jenivojske jezike, kot je npr. CPython.\n_START_SECTION_\nZgodnji razvoj\n_START_PARAGRAPH_\nIzvor jezika C je tesno povezan z razvojem operacijskega sistema Unix, ki so ga izvirno razvili v zbirnem jeziku na minira\xc4\x8dunalniku DEC PDP-7 Ritchie, Thompson, Joe Ossana, Rudd Canaday in Doug McIlroy v AT&T Bellovih laboratorijih, in vklju\xc4\x8dili ve\xc4\x8d zamisli svojih kolegov. V za\xc4\x8detku Thompson niti ni programiral na samem PDP-7, ampak je rabil mno\xc5\xbeico makrojev za zbirni jezik GEMAP na 32-bitnem osrednjem stroju General Electric GE-635. Nato je poprocesor tvoril papirni trak, ki ga je PDP-7 lahko prebiral. Kmalu je Unix s preprostim jedrom, zbirnim jezikom, preprosto lupino (tolma\xc4\x8dem ukazov) in z nekaterimi pripomo\xc4\x8dki (kot npr. Unixovi ukazi rm, cat, cp) leta 1969 postal samozadosten, in razvoj se je lahko nadaljeval neodvisno na samem PDP-7. Douglas McIlroy je kmalu zatem tvoril prvi visokonivojski jezik sistema Unix, izvedbo prevajalnika prevajalnikov TMG Roberta M. McClurea. McIlroy in Bob Morris sta uporabila TMG za zgodnji prevajalnik jezika PL/I v operacijskem sistemu Multics. Thompson se je zaradi McIlroyjevega uspeha reproduciranja TMG odlo\xc4\x8dil, da je Unix, ki verjetno tedaj \xc5\xa1e ni bil imenovan tako, potreboval lasten sistemski programski jezik._NEWLINE_Pisanje v zbirnem jeziku novo nastalega Unixa je bilo nerodno. Za pisanje programskih struktur se je porabilo ve\xc4\x8d \xc4\x8dasa, kodo je bilo te\xc5\xbeje razhro\xc5\xa1\xc4\x8devati in jo razumeti. Thomson je \xc5\xbeelel imeti prednosti visokonivojskega jezika vendar ne v smislu operacijskega sistema Multics, napisanega v PL/I in zbirnem jeziku. Bil je vodja neformalne skupine v AT&T, ki je za\xc4\x8dela pregledovati mo\xc5\xbenosti drugih operacijskih sistemov in vi\xc5\xa1jenivojskih jezikov. Najprej je s pomo\xc4\x8djo TMG leta 1970 neuspe\xc5\xa1no hotel uporabiti Fortran, nato pa je ustvaril jezik B s poenostavitvijo raziskovalnega jezika BCPL, ki ga je leta 1967 razvil Martin Richards, tako da je lahko njegov tolma\xc4\x8d \xc5\xa1el v 8 kB 18-bitni besedni pomnilnik ra\xc4\x8dunalnika PDP-7._NEWLINE_B se je izkazal za zelo po\xc4\x8dasnega in nezmo\xc5\xbenega za sistemsko programiranje v samem Unixu. Tako kot BCPL je bil brez tipov. Pri novem zmogljivej\xc5\xa1em ra\xc4\x8dunalniku DEC PDP-11 je bil jezik brez tipov neizvr\xc5\xa1ljiv. Njegov procesor je podpiral podatkovne tipe razli\xc4\x8dnih velikosti in z jezikom B tega ni bilo mo\xc4\x8d izraziti. Problem je bilo tudi izvajanje. Thompson in Ritchie sta se odlo\xc4\x8dila prenesti operacijski sistem na PDP-11. Prva razli\xc4\x8dica PDP-11 je imela 16 kB pomnilnika za operacijski sistem in 8 kB za uporabni\xc5\xa1ke programe. Tudi njegov operacijski sistem je bil napisan v zbirnem jeziku. \xc5\xbdelela sta napisati operacijski sistem v jeziku B. Najprej je zaradi nezmo\xc5\xbenosti rabe nekaterih prednosti ra\xc4\x8dunalnika PDP-11, \xc5\xa1e posebej bajtno naslovljivost, v letu 1971 nastal \xc2\xbbnovi B\xc2\xab\xc2\xa0(NB), ki je re\xc5\xa1il te probleme. Ta jezik se je kmalu razvil in preimenoval (leta 1972) v C. Postal je prevajalni in ne tolma\xc4\x8ditveni jezik._NEWLINE_Za\xc4\x8detni razvoj jezika C je po Ritchiejevih besedah potekal v AT&T Bellovih laboratorijih med letoma 1969 in 1973. Najbolj kreativno obdobje je bilo leta 1972. Tedaj je bila ve\xc4\x8dina Unixa ponovno napisana v C-ju. Do leta 1973 z dodatkom podatkovnega tipa zapisov struct je C postal dovolj mo\xc4\x8dan za prevod Unixovega jedra. Novi jezik je dobil ime \xc2\xbbC\xc2\xab, ker so bili njegovi gradniki izvedeni iz jezika \xc2\xbbB\xc2\xab, ta pa je bil po Thompsonovih besedah okle\xc5\xa1\xc4\x8dena razli\xc4\x8dica jezika BCPL._NEWLINE_Tako je bilo Unixovo jedro prvo jedro kak\xc5\xa1nega operacijskega sistema napisano v drugem jeziku od zbirnega. Pred tem sta bila na primer \xc5\xa1e operacijska sistema Multics (napisan v PL/I) in MCP (Master Control Program) za sistem Burroughs B5000 (napisan v ALGOLu leta 1961.) Leta 1977 sta Ritchie in Stephen Curtis Johnson dodatno spremenila jezik C za pospe\xc5\xa1itev prenosljivosti operacijskega sistema Unix. Johnsonov Portable C Compiler (PCC) je slu\xc5\xbeil kot osnova za ve\xc4\x8d izvedb C-ja na novih platformah.\n_START_SECTION_\nKomentarji\n_START_PARAGRAPH_\nKomentarji so lahko med razmejilnima znakoma /* in */ enovrsti\xc4\x8dno ali mnogovrsti\xc4\x8dno, od standarda C99 naprej pa tudi za razmejilnima znakoma // enovrsti\xc4\x8dno do konca vrstice. Komentarji, ki jih razmejujeta /* in */, ne smejo biti vgnezdeni. \xc4\x8ce se zaporedje teh dveh znakov pojavi znotraj znakovnega niza ali znakovnega \xc4\x8drkovnega simbola, se ne obravnavata kot razmejilna znaka komentarja. Komentarji oblike:_NEWLINE_/* ... *//*...*//* ... // ... */// .../*... // ...*/_NEWLINE_so v redu, vgnezdeni enovrsti\xc4\x8dno pa npr. ne:_NEWLINE_/* /* ... */ ... */_NEWLINE_ali vgnezdeni mnogovrsti\xc4\x8dno:_NEWLINE_/* /* ... */ ... _NEWLINE_*/_NEWLINE_saj drugo zaporedje /* ne velja za razmejilni znak komentarja, kot tudi ne drugo zaporedje */, ki je sedaj zunaj komentarja, in prevajalnik bi v obeh primerih javil napako.\n_START_SECTION_\nIzrazi\n_START_PARAGRAPH_\nDatoteke s C-jevsko izvorno kodo vsebujejo ozna\xc4\x8ditev (deklaracijo) in opredelitev (definicijo) funkcij. Opredelitve funkcij po vrsti vsebujejo ozna\xc4\x8ditve in stavke. Ozna\xc4\x8ditve opredeljujejo nove podatkovne tipe z rezerviranimi besedami, kot so: struct, union in enum, ali prirejajo tipe in morda rezervirajo pomnilni\xc5\xa1ka mesta novim spremenljivkam, po navadi z zapisom tipa, ki mu sledi ime spremenljivke. Rezervirane besede, kot sta char in int, ozna\xc4\x8dujejo vgrajene tipe. Deli kode so obdani z zavitima oklepajema { in }, ki omejujeta ozna\xc4\x8ditveno podro\xc4\x8dje ali pa delujeta kot samostojni stavek za nadzorne strukture._NEWLINE_C kot imperativni jezik za ozna\xc4\x8ditev dejanj rabi stavke. Najbolj raz\xc5\xa1irjeni stavek je izrazni stavek, ki vsebuje izraz, kateremu je treba dolo\xc4\x8diti vrednost, izrazu pa sledi podpi\xc4\x8dje. Zaradi \xc5\xa1e ve\xc4\x8dje preglednosti se podpi\xc4\x8dje velikokrat razmakne od ozna\xc4\x8ditvenih/ukaznih besed z dodatnim presledkom. Na primer:_NEWLINE_int a;                  |   int a ;for (i=0; i<max; i++)   |   for (i = 0 ; i < max ; i++)_NEWLINE_Kot stranski pojav dolo\xc4\x8ditve vrednosti se funkcije lahko kli\xc4\x8dejo in spremenljivkam se lahko priredijo nove vrednosti. Za spreminjanje normalne zaporedne izvr\xc5\xa1itve stavkov ima C ve\xc4\x8d stavkov za nadzor toka, ki jih ozna\xc4\x8dujejo rezervirane besede. Strukturalno programiranje je podprto s pogojno izvr\xc5\xa1itvijo if(-else), z iterativnimi izvr\xc5\xa1itvami (zankami) if(-else), while in for. Stavek for ima lo\xc4\x8dene dodelitvene izraze, izraze za preverjanje in izraze za ponovno dodelitev \xe2\x80\x93 vsak od njih pa se lahko opusti. Izraza break in continue se lahko rabita za zapustitev najbolj notranjega zan\xc4\x8dnega stavka ali za presko\xc4\x8ditev na njeno ponovno dodelitev. Obstaja tudi nestrukturalni stavek goto, ki preusmerja neposredno na imenovano oznako znotraj funkcije. switch izbere primer, ki se izvede na podlagi vrednosti celo\xc5\xa1tevilskega izraza._NEWLINE_Izrazi lahko rabijo razli\xc4\x8dne vgrajene operatorje in lahko vsebujejo klice funkcij. Vrstni red po katerem se dolo\xc4\x8dijo vrednosti parametrom funkcij in operandom ve\xc4\x8dine operatorjev ni dolo\xc4\x8den. Dolo\xc4\x8devanje vrednost je lahko tudi vlo\xc5\xbeeno vmes. Vendar se bodo vsi stranski vplivi (vklju\xc4\x8dno s pomnilnikom do spremenljivk) pojavili pred naslednjo\xc2\xa0\xc2\xbbzaporedno to\xc4\x8dko\xc2\xab. Zaporedne to\xc4\x8dke vsebujejo zaklju\xc4\x8dek vsakega izraznega stavka ter vstop in vra\xc4\x8danje iz vsakega klica funkcije. Zaporedne to\xc4\x8dke se pojavijo tudi med dolo\xc4\x8devanjem vrednosti izrazov, ki vsebujejo dolo\xc4\x8dene operatorje (&&, ||, ?: in operator vejica). To dovoljuje visoko stopnjo optimizacije kode prevajalnika, vendar od programerjev v C zahteva ve\xc4\x8djo skrb za dosego zanesljivih rezultatov kot je potrebna pri drugih programskih jezikih._NEWLINE_Kernighan in Ritchie v uvodu knjige Programski jezik C pravita: \xc2\xbbKakor drugi jeziki ima C svoje hibe. Nekateri od operatorjev imajo napa\xc4\x8dno prednost; nekateri deli skladnje bi lahko bili bolj\xc5\xa1i.\xc2\xab Standard C ni posku\xc5\xa1al popraviti veliko od teh hib zaradi vpliva tak\xc5\xa1nih sprememb na \xc5\xbee obstoje\xc4\x8do programsko opremo.\n_START_SECTION_\nZgradba, oblika programa in slog v C\n_START_PARAGRAPH_\nOsnovni gradnik programa v C je funkcija. Vsak program v C je zbirka ene ali ve\xc4\x8d funkcij. Funkcije sestavljajo ozna\xc4\x8ditve spremenljivk in stavki, ali zapleteni ukazi, obkro\xc5\xbeata pa jih zavita oklepaja ({ in }).\n_START_SECTION_\nProgram Pozdravljen, svet\n_START_PARAGRAPH_\nSpodnji zgled izpi\xc5\xa1e znakovni niz \xc2\xbbPozdravljen svet!\xc2\xab\xc2\xa0na standardni izhod. Navadno je standardni izhod povezan z zaslonom monitorja, lahko pa je tudi datoteka ali kak\xc5\xa1na druga strojna naprava. Program je napisan v skladu s standardom ANSI C._NEWLINE_#include <stdio.h>int main(void){_NEWLINE_    printf("Pozdravljen svet!\\r\\n");_NEWLINE_    return 0;}_NEWLINE_Sledi analiza programa po vrsticah:_NEWLINE_#include <stdio.h>_NEWLINE_Prva vrstica v programu je predprocesorski ukaz (navodilo, direktiva) #include. Pred samim prevajanjem programa predprocesor pregleda izvorno kodo in izvr\xc5\xa1i vse predprocesorske ukaze. Ti ukazi se vedno za\xc4\x8dnejo z znakom #. Ukaz #include povzro\xc4\x8di, da se na njegovo mesto v izvorno kodo vklju\xc4\x8di datoteka stdio.h, ki vsebuje standardne vhodno izhodne funkcije._NEWLINE_int main(void)_NEWLINE_V naslednji vrstici se opredeli funkcija z imenom main. Ta funkcija ima poseben pomen v C programih. Pri za\xc4\x8detku izvajanja programa se najprej kli\xc4\x8de ta funkcija. Klju\xc4\x8dna beseda int na za\xc4\x8detku vrstice pove, da funkcija main() vrne celo \xc5\xa1tevilo, klju\xc4\x8dna beseda void pa, da funkcija ne sprejme nobenih parametrov. Funkcija main po standardu ANSI C vedno vra\xc4\x8da vrednost, \xc4\x8deprav nekateri prevajalniki prevedejo kodo uspe\xc5\xa1no, \xc4\x8detudi temu ni tako. Tudi v jeziku C++ je ta funkcija \xc5\xa1e vedno C-jevska. Funkcija main je lahko opredeljena s pomo\xc4\x8djo naslednjih \xc5\xa1tirih oblik ob ozna\xc4\x8ditvi:_NEWLINE_int main() { /* ... */ }int main(void) { /* ... */ }int main(int argc, char *argv[]) { /* ... */ }int main(int argc, char **argv) { /* ... */ }_NEWLINE_oziroma prototipno:_NEWLINE_int main();int main(void);int main(int, char *[]);int main(int, char **);_NEWLINE_Prvi dve opredelitvi sta enakovredni (in zdru\xc5\xbeljivi s C++)._NEWLINE_{_NEWLINE_Odprti zaviti oklepaj pomeni za\xc4\x8detek opredelitve funkcije main._NEWLINE_printf("Pozdravljen svet!\\r\\n");_NEWLINE_V tej vrstici se kli\xc4\x8de funkcija printf, ki je ozna\xc4\x8dena v datoteki stdio.h. Pri tem klicu se funkciji printf poda en parameter v obliki znakovnega niza. Na koncu znakovnega niza je \xc5\xa1e posebni dvoznakovni niz \\n, ki se prevede v znak EOL (end of line). Znak je namenjen kot ukaz izhodni napravi, da postavi trenutno lego na za\xc4\x8detek naslednje vrstice._NEWLINE_return 0;_NEWLINE_Vrstica zaklju\xc4\x8di izvajanje funkcije main in vrne celo \xc5\xa1tevilo 0._NEWLINE_}_NEWLINE_Zaprti zaviti oklepaj pomeni zaklju\xc4\x8dek opredelitve funkcije main.\n_START_SECTION_\nNajmanj\xc5\xa1i program\n_START_PARAGRAPH_\nKatera opredelitev funkcije main se uporabi v programu, je verjetno odvisno od posamezne izbire. Trenutni standard C vsebuje dva zgleda rabe main() in dva main(void), standard C++ pa rabi main(). Vrednost, ki jo main vra\xc4\x8da (in mora biti tipa int), slu\xc5\xbei kot status prekinitve. Tega program vrne gostiteljevemu okolju._NEWLINE_Standard C definira vrnitveni vrednosti 0 (\xc2\xbbni\xc4\x8d napak\xc2\xab\xc2\xa0(zero errors)) in EXIT_SUCCESS, ki ozna\xc4\x8dujeta uspeh, ter EXIT_FAILURE za ozna\xc4\x8devanje neuspe\xc5\xa1nega izvajanja programa. (EXIT_SUCCESS in EXIT_FAILURE sta opredeljeni v standardni zaglavni datoteki stdlib.h). Druge vrnitvene vrednosti slu\xc5\xbeijo kot izvedbeni opredelitveni pomeni. V Linuxu na primer program, ki ga je prekinil ukaz signal, vrne kodo \xc5\xa1tevilske vrednosti signala plus 128._NEWLINE_Najmanj\xc5\xa1i pravilen program v C vsebuje prazno funkcijo main brez parametrov:_NEWLINE_int main(void){}_NEWLINE_Lahko se zapi\xc5\xa1e tudi v ve\xc4\x8d vrsticah:_NEWLINE_int main(void){           /* za\xc4\x8detek telesa funkcije v prvem stolpcu vrstice  */}_NEWLINE_ali redkeje sicer v skladu z dobrim slogom:_NEWLINE_int         /* podatkovni tip vrnjene vrednosti funkcije         */main(void)  /* ime funkcije v prvem stolpcu vrstice              */{           /* za\xc4\x8detek telesa funkcije v prvem stolpcu vrstice   */}_NEWLINE_Sploh pa je slaba praksa pisati neporavnano, kot npr:_NEWLINE_int_NEWLINE_    main_NEWLINE_        /*            ** * *   * **/ (_NEWLINE_        void_NEWLINE_    ){ }_NEWLINE_ali:_NEWLINE_    int_NEWLINE_   main/* ** * *  * **/(void){ }_NEWLINE_oziroma poravnano brez reda:_NEWLINE_int    main    /***     *       ****/   (       void)      {       }_NEWLINE_Preveden program bo sicer deloval, izvorna koda pa je \xc5\xbee v preprostem zgledu nepregledna. Seveda je treba rezervirane besede, imena spremenljivk in funkcij pisati brez presledkov._NEWLINE_Okrogla oklepaja (), ki sledita imenu funkcije, morata biti vklju\xc4\x8dena, saj na ta na\xc4\x8din C razlikuje funkcije od navadnih spremenljivk. Na\xc4\x8deloma pri funkcijah za imenom funkcije in odprtim oklepajem ni presledka, npr. main(void) in ne main (void), z razliko od sizeof (), ki dejansko strogo ni funkcija, in je skladenjska rezervirana beseda za eno\xc4\x8dleni operator. sizeof je lahko podobno kot return brez okroglih oklepajev. Pri return je to celo za\xc5\xbeeleno, razen \xc4\x8de je dvoumno._NEWLINE_Ker nista navedena return ali exit, funkcija main ob izhodu vrne 0. To je poseben primer predstavljen v standardu C99, ki velja le za funkcijo main. \xc4\x8ce se zahteva \xc5\xa1e ta navedba, ima najmanj\xc5\xa1i program obliko:_NEWLINE_int main(void) { return 0; }_NEWLINE_Funkcija main bo za uspe\xc5\xa1no delovanje programa po navadi klicala druge funkcije. Ni treba, da je na vrhu programa, tako da se program v C ne za\xc4\x8dne v prvi vrstici, ampak tam kjer je navedena funkcija main. Funkcije main ni mo\xc5\xbeno klicati ali jo zagnati s kak\xc5\xa1no drugo funkcijo v programu. Kli\xc4\x8de jo lahko le operacijski sistem in na ta na\xc4\x8din se za\xc5\xbeene program v C. Funkcija main ni nikoli stati\xc4\x8dna, in, \xc4\x8de je navedena kot static int main(), bo prevajalnik obi\xc4\x8dajno javil napako._NEWLINE_Nekatere izvedbe niso izvedljive, po navadi zaradi tega, ker niso mi\xc5\xa1ljene za rabo z operacijskim sistemom. Tak\xc5\xa1ne izvedbe se v standardu C imenujejo prostostoje\xc4\x8de (free-standing). V prostostoje\xc4\x8di izvedbi ni podrobnega opisa kako naj obravnava izvajanje programa. V programu \xc5\xa1e posebej ni treba opredeliti funkcije main._NEWLINE_Druge funkcije se lahko imenujejo poljubno v skladu s skladnjo jezika. Lahko jih napi\xc5\xa1e programer sam ali pa se rabijo obstoje\xc4\x8de iz knji\xc5\xbenic. Vmesniki za knji\xc5\xbeni\xc5\xa1ke funkcije so obi\xc4\x8dajno navedeni z vklju\xc4\x8ditvijo zaglavnih datotek s preprocesorsko direktivo #include, objekti knji\xc5\xbenice pa se pove\xc5\xbeejo v kon\xc4\x8dno izvr\xc5\xa1no sliko. Dolo\xc4\x8dene knji\xc5\xbeni\xc5\xa1ke funkcije, kot sta na primer printf ali scanf, so definirane s standardom C, in se imenujejo standardne knji\xc5\xbeni\xc5\xa1ke funkcije._NEWLINE_Funkcija lahko vrne vrednost klicatelju - po navadi drugi funkciji C-ja, ali gostiteljevemu okolju za funkcijo main. Zgoraj omenjena funkcija printf vrne koliko znakov je bilo izpisano, vendar se ta vrednost obi\xc4\x8dajno prezre.\n_START_SECTION_\nIzmenljivost polj in kazalcev\n_START_PARAGRAPH_\nZapis s spu\xc5\xa1\xc4\x8denimi indeksi x[i] (kjer x ozna\xc4\x8duje kazalec) je skladenjski sladkor za *(x+i). S prednostjo pomnilnikovega znanja o kazal\xc4\x8dnem tipu naslov, na katerega ka\xc5\xbee x + i, ni osnovni naslov (na katerega ka\xc5\xbee x), pove\xc4\x8dan za i bitov, ampak je dolo\xc4\x8den kot osnovni naslov, pove\xc4\x8dan z i pomno\xc5\xbeenim z velikostjo elementa, na katerega ka\xc5\xbee x. Tako x[i] ozna\xc4\x8duje i+1-ti element polja._NEWLINE_V ve\xc4\x8dini izraznih kontekstov, kjer je ve\xc4\x8dja izjema operand sizeof, se naprej ime polja samodejno pretvori v kazalec na prvi element polja. To pomeni, da se polje nikoli v celoti ne skopira, ko je imenovan kot parameter funkciji, ampak se prenese le naslov njegovega prvega elementa. \xc4\x8ceprav klici funkcij v C uporabljajo semantiko klicev po vrednosti, so tako polja u\xc4\x8dinkovito prenesena v sklicu._NEWLINE_Velikost elementa se lahko dolo\xc4\x8di s pomo\xc4\x8djo operatorja sizeof na katerikoli dereferenciran element x, kot v izrazu n = sizeof *x ali n = sizeof x[0], tako, da se \xc5\xa1tevilo elementov v ozna\xc4\x8denem polju polje lahko dolo\xc4\x8di kot sizeof polje / sizeof polje[0]. Zadnji izraz velja le za imena polj: spremenljivke ozna\xc4\x8dene s spu\xc5\xa1\xc4\x8denimi indeksi (int polje[20]). Zaradi semantike C-ja ni mogo\xc4\x8de dolo\xc4\x8diti celotne velikosti polj prek kazalcev na polja ali polj tvorjenih z dinami\xc4\x8dno dodelitvijo (malloc). Tako izrazi, kot je sizeof vptr / sizeof vptr[0] (kjer vptr ozna\xc4\x8duje kazalec), ne bodo delovali, saj prevajalnik privzame, da se zahteva velikost kazalca samega. Ker parametri imena polja na sizeof niso pretvorjeni v kazalce, ne ka\xc5\xbeejo tak\xc5\xa1ne nejasnosti. V polja tvorjena z dinami\xc4\x8dno dodelitvijo pa se dostopa s kazalci in ne kot prave spremenljivke polja, zato imajo enake te\xc5\xbeave z operatorjem sizeof kot kazalci na polja. \xc4\x8ce se v kak\xc5\xa1ni funkciji potrebuje vrednost velikosti (enorazse\xc5\xbenega) poljavptr, jo je treba vklju\xc4\x8diti kot njen parameter (npr. velikost). Na primer:_NEWLINE_...{int *vptr = NULL;static const int velikost = 10;_NEWLINE__NEWLINE_   vptr = (int *) malloc(velikost * sizeof(vptr));_NEWLINE_   funkcija(vptr, velikost);_NEWLINE_   free(vptr);...}funkcija(int *v, int n)  /* funkcija ima (vsaj) dva parametra \xe2\x80\x93 kazalec na polje */{                        /* in njegovo velikost (n)                              */...}_NEWLINE_Podobno velja za mnogorazse\xc5\xbena polja._NEWLINE_Navkljub tej navidezni enakosti med polji in kazal\xc4\x8dnimi spremenljivkami je tako med njimi \xc5\xa1e vedno razlika. \xc4\x8ceprav se v ve\xc4\x8dini izraznih kontekstih ime polja pretvori v kazalec (na njegov prvi element), kazalec sam ne zajema nobega dela pomnilnika \xe2\x80\x93 ime polja ni l-vrednost in njegov naslov je konstanta, z razliko od kazal\xc4\x8dne spremenljivke. Zaradi tega se podro\xc4\x8dje \xc2\xbbna katerega ka\xc5\xbee polje, ne more spremeniti, in na ime polja je nemogo\xc4\x8de prirediti nov naslov. Vsebina polj pa se lahko kopira, na primer s pomo\xc4\x8djo funkcije memcpy ali z dostopanjem do posameznih elementov.\n_START_SECTION_\nKnji\xc5\xbenice\n_START_PARAGRAPH_\nOsnovno raz\xc5\xa1iritev jezika C predstavljajo knji\xc5\xbenice. Knji\xc5\xbenica je v C mno\xc5\xbeica funkcij zbrana v eni \xc2\xbbarhivski\xc2\xab\xc2\xa0datoteki. Vsaka knji\xc5\xbenica ima po navadi zaglavno datoteko s prototipi funkcij, ki jih vsebuje knji\xc5\xbenica in se lahko rabijo v programu, in ozna\xc4\x8ditvami posebnih podatkovnih tipov in makro simbolov znotraj teh funkcij. Da lahko program rabi knji\xc5\xbenico, mora vsebovati njeno zaglavno datoteko, knji\xc5\xbenica pa mora biti povezana s programom, kar v mnogih primerih zahteva prevajalnikove zastavice (na primer -lm, okraj\xc5\xa1ano za \xc2\xbbpove\xc5\xbei z matemati\xc4\x8dno knji\xc5\xbenico\xc2\xab\xc2\xa0(link the math library))._NEWLINE_Najobi\xc4\x8dajnej\xc5\xa1a knji\xc5\xbenica C je standardna knji\xc5\xbenica jezika C, ki jo navajata standarda ISO in ANSI C. Standardna knji\xc5\xbenica je del vsake implementacije C. Implementacije, ki ciljajo na omejena okolja, kot so na primer vgradni sistemi, lahko zagotavljajo le podmno\xc5\xbeico standardne knji\xc5\xbenice. Standardna knji\xc5\xbenica C podpira vhodno-izhodni tok, dodelitev pomnilnika, matemati\xc4\x8dne funkcije in koli\xc4\x8dine, znakovne nize in \xc4\x8dasovne vrednosti. Ve\xc4\x8d lo\xc4\x8denih standardnih zaglavnih datotek (na primer stdio.h) dolo\xc4\x8da vmesnike zanje in druge pripomo\xc4\x8dke standardne knji\xc5\xbenice._NEWLINE_Druge obi\xc4\x8dajne mno\xc5\xbeice funkcij knji\xc5\xbenice C so tiste, ki se rabijo v aplikacijah, posebej prirejenih za Unix in sisteme podobne Unix, \xc5\xa1e posebej funkcije, ki zagotavljajo vmesnik za jedro. Te funkcije v podrobnosti navajajo standardi, kot sta POSIX in Single UNIX Specification._NEWLINE_Ker je veliko programov napisanih v C, so na voljo raznolike druge knji\xc5\xbenice. Knji\xc5\xbenice so obi\xc4\x8dajno napisane v C, ker C-jevski prevajalniki tvorijo u\xc4\x8dinkovito objektno kodo. Programerji nato naredijo vmesnike h knji\xc5\xbenici, tako da se lahko njeni podprogrami rabijo v visokonivojskih jezikih, kot so java, Perl in Python.\n_START_SECTION_\nJezikovna orodja\n_START_PARAGRAPH_\nZa pomo\xc4\x8d programerjem v C pri iskanju in popravljanju stavkov z nedefiniranim obna\xc5\xa1anjem ali z mo\xc5\xbenimi napa\xc4\x8dnimi izrazi so razvili ve\xc4\x8d orodij z ve\xc4\x8djo strogostjo, ki jo zagotavljajo prevajalniki. Med prvimi tak\xc5\xa1nimi orodji je bilo orodje lint. Njegov razvoj je vodil do nastanka mnogih drugih._NEWLINE_Avtomatizirano preverjanje izvorne kode in preglejevanje je koristno v vsakem jeziku. Za C obstaja ve\xc4\x8d tak\xc5\xa1nih orodij, kot na primer lint. Obi\xc4\x8dajna praksa je, da se z orodjem lint odkrije vpra\xc5\xa1ljiva koda, ko je program prvi\xc4\x8d napisan. Ko program preveri lint, se ga s prevajalnikom za C prevede. Poleg tega lahko mnogi prevejalniki opcijsko opozorijo o skladenjsko pravilnih konmstruktih, ki bodo verjetno dejansko napake. MISRA C je lastni\xc5\xa1ka mno\xc5\xbeica navodil v izogib tak\xc5\xa1ni vpra\xc5\xa1ljivi kodi, razvita za vgradne sisteme._NEWLINE_Obstajajo tudi prevajalniki, knji\xc5\xbenice in mehanizmi na nivoju operacijskih sistemov za izvajanje procesov, ki niso standardni deli jezika C, kot na primer: preverjanje mej polj, odkrivanje prekora\xc4\x8ditve medpomnilnika, serializacija, sledenje dinami\xc4\x8dnemu pomnilniku in samodejno \xc4\x8di\xc5\xa1\xc4\x8denje pomnilnika._NEWLINE_Orodja, kot so pomnilni\xc5\xa1ki razhro\xc5\xa1\xc4\x8devalniki: Purify, Valgrind, Insure++, dmalloc, Electric Fence, Inspector, libcwd, Memwatch, MTuner, Oracle Developer Studio, Splint, TotalView ali WinDbg skupaj s povezovanjem knji\xc5\xbenic, ki vsebujejo posebne razli\xc4\x8dice funkcij dinami\xc4\x8dnih dodelitev pomnilnika, lahko pomagajo odkrivati napake v rabi pomnilnika pri izvajanju.'