-{C}- () процедурални је програмски језик, настао 1972. године. Аутор језика је Денис Ричи, а настао је у истраживачком центру -{Белове лабораторије}- у Њу Џерзију за потребе оперативног система -{UNIX}-.

Настанак Прве верзије оперативног система -{UNIX}- су биле, због неопходне брзине извршавања, писане користећи асемблер, али се овај пројекат брзо приближавао свом крају јер је програмски код асемблера изразито велик и тежак за одржавање. Архитектама -{UNIX}--а је био потребан програмски језик који би задржао ефикасност асемблера, али истовремено пружио и комфор већ постојећих виших програмских језика, попут Паскала, Кобола и др. Идеја је била начинити програмски језик који би имао све ово, али чија архитектура и логика не би много одударала од асемблерске. Због тога -{C}--ове контролне структуре наликују на асемблерске, а постоје и изрази који непосредно позивају одговарајуће асемблерске инструкције. Тако, израз x++ позива асемблерску инструкцију INC. Језик је био потпун успех, и користио се за писање свих будућих верзија -{UNIX}--a. У градњи пројекта је учествовао као главни пројектант Денис Ричи, који је уосталом био и један од водећих пројектаната за оперативни систем -{UNIX}-.

Програмски језик C је језик опште намене. Иако је развијан као „језик за системско програмирање”, подједнако добро се користи за писање значајних програма у различитим областима. C је такође веома утицао на многе друге популарне програме, посебно на -{C++}-, који је оригинално развијан као надградња C-а.

-{K&R C}- Брајан Керниген () и Денис Ричи () су 1978. објавили прво издање књиге Програмски језик -{C}- (). Ова књига, позната C програмерима као -{„K&R”}-, служила је много година као незванична спецификација језика. Верзија -{С-а}- коју она описује често се назива -{„K&R С”}-. Друго издање ове књиге покрива каснији С89 -{ANSI C}- стандард. Амерички национални институт за стандарде (-{American National Standard Institute (ANSI)}-) je 1983 формирао комитет, X3J11, да установи стандард за C. Стандард је ратификован 1989 као -{ANSI X3.159-1989 „Programming Language C”}-. Ова верзија -{С-а}- се често назива -{ANSI C}-, Стандардни C, или понекад -{С89}-. -{ANSI C}- стандард је са неколико мањих модификација 1990. прихватила „Међународна организација за стандардизацију” (ISO) као -{ISO/IEC}- 9899:1990. Ова верзија се понекад назива -{С90}-. Због тога се појмови -{„C89”}- и -{„C90”}- односе на суштински исти језик.

-{ANSI C}- и -{ISO C}- Током касних 70-их и 80-их, верзије C-а су имплементиране за различите -{mainframe}- рачунаре, минирачунаре и микрорачунаре, укључујући -{IBM PC}-, тако да је његова популарност значајно порасла. Године 1999. објављен је стандард -{ISO/IEC}- 9899:1999. Овај стандард се често назива -{С99}-. -{С99}- уводи неколико нових особина, од којих су многе већ биле имплементиране у неколико компајлера: линијске () функције неколико нових типова података, укључујући -{long long int}-, -{boolean}- тип података, -{complex}- тип података за представљање комплексних бројева низове променљиве величине нове функције стандардне библиотеке, као што је -{snprintf}- подршку за коментаре у једној линији који почињу знацима // побољшана подршка за IEEE 754 рачунање у покретном зарезу — израчунавање реалних бројева може бити урађено и са једноструком тачношћу

C је независан од конкретне архитектуре рачунарског система. Стандард чини све аспекте преносивости експлицитним.

Подршка компајлера -{GCC}- и други C компајлери сада имају подршку за многе нове особине -{С99}- стандарда. Ипак, постоји слабија подршка произвођача као што су Мајкрософт и Борланд који су се углавном концентрисали на -{С++}-, који обезбеђује слична функционална побољшања.

Упркос значајној подршци за -{C99}-, -{GCC}- није потпуно сагласна имплементација стандарда; неколико кључних особина није имплементирано или не раде коректно.

Према тврдњама компаније -{Sun Microsystems}-, -{Sun Studio}- (који је бесплатан за преузимање) сада подржава комплетни -{С99}- стандард.

Откривање (детекција) верзије Стандардни макро -{__STDC_VERSION__}- је дефинисан са вредношћу -{199901L}- која указује да је подржан -{C99}- стандард. Као и __STDC__ макро за -{C90}-, -{__STDC_VERSION__}- макро може бити коришћен да се напише код који ће се компајлирати различито за -{С90}- и -{С99}- компајлере. Пример: -{ #if __STDC_VERSION__ >= 199901L /* "inline" је кључна реч */ #else # define inline /* ништа */ #endif

Примена Денис Ричи је -{C}- оригинално створио и применио на -{UNIX}- оперативном систему на -{DEC}--овом -{PDP-11}-. Оперативни систем, -{C}- компајлер и сви -{UNIX}--ови апликативни програми су написани на -{C}--у. Језик се након своје примарне употребе проширио на све сфере програмирања. Прославивши се својом брзином, постао је језик избора за многе будуће пројекте, попут различитих верзија -{Windows}--а и -{UNIX}--а, али и у апликативном програмирању за многобројне примене током деценија. И данас се користи у великој мери, првенствено за системско програмирање. Још једна последица широке прихваћености и ефикасности -{C}--а је та да су компајлери, библиотеке и интерпретатори других програмских језика високог нивоа често написани на -{C}--у.

Организација језика Организационе целине -{C}--а су функције. Почетна тачка извршавања програма је тзв. „главна функција” (), а целокупан програм се организује у одређени број других функција, у зависности од потребе. Функције се посматрају одвојеним, изолованим целинама чиме се постиже модуларност кода који је као такав лак за одржавање и даље развијање.

Свака функција има свој именски простор и нема директан приступ променљивама других функција. Посредан приступ променљивама других функција је обезбеђен механизмом показивача и аргумената функције.

Тело функције је ограничено витичастим заградама, како би јој се означили почетак и крај. Унутар функција делови кода могу бити одвојени у функцијске подблокове.

Програм се извршава почев од прве линије кода функције main. Она може позивати друге функције или саму себе (види рекурзија). По завршетку функције -{main}-, читав програм се завршава и ослобађа из меморије.

Уз стандардни -{C}- се дистрибуирају и стандардне библиотеке. То су датотеке које садрже мноштво корисних алата који се користе у свакодневном раду. Програмер може да укључи једну или више ових библиотека у свој програм, а може и сам да пише библиотеке за своје потребе.

-{C}- оператори

-{C}- подржава богат скуп оператора. -{C}- има аритметичке операторе, операторе поређења (релацијске), логичке, битске (операторе за манипулисање битовима), операторе доделе, увећања и умањења за један, референцирања и дереференцирања, условни оператор, оператор промене типа (конверзије)… Оператор Пример Опис/Значење

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

() -{f()}- Позив функције

[] -{n}- Референца низа

-> -{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)

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

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

Примери Ово је најмањи могући C програм.main() { } Пример који следи је кратак -{Hello World}- програм, написан на програмском језику -{C}-. Овај пример је постао модел за уводни пример за многе програмске језике. Штампа поруку -{„Zdravo svete”}-.-{R|#include <stdio.h> /* укључујемо библиотеку која нам омогућава рад са тастатуром и екраном */

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

Сваки C програм се састоји из функција и променљивих. main функција је посебна — сваки програм мора садржати ову функцију јер се програм извршава од почетка main функције.

Прва линија програма #include <stdio.h> је претпроцесорска директива која говори да треба усвојити информацију о стандардној улазно-излазној библиотеци. Коришћењем ознака /* */ смо убацили коментаре у програм. main функција позива printf функцију из стандардне библиотеке, којом се исписује порука на екран.

Како функција printf после завршеног исписа не прелази аутоматски у нови ред, претходни програм можемо написати и на следећи начин: -{#include <stdio.h> int main(void) { printf("Dobar "); printf("dan."); printf("\n"); return 0;

Можемо приметити да када желимо да пређемо у нови ред, користимо посебни знак \n. На крају, наредбом return 0, main функција враћа вредност нула у позивни програм.

Контролне структуре