C (програмски језик)
C (транскр. Це) процедурални је програмски језик, настао 1972. године. Аутор језика је Денис Ричи, а настао је у истраживачком центру Белове лабораторије у Њу Џерзију за потребе оперативног система UNIX. НастанакПрве верзије оперативног система UNIX су биле, због неопходне брзине извршавања, писане користећи асемблер, али се овај пројекат брзо приближавао свом крају јер је програмски код асемблера изразито велик и тежак за одржавање. Архитектама UNIX-а је био потребан програмски језик који би задржао ефикасност асемблера, али истовремено пружио и комфор већ постојећих виших програмских језика, попут Паскала, Кобола и др. Идеја је била начинити програмски језик који би имао све ово, али чија архитектура и логика не би много одударала од асемблерске. Због тога C-ове контролне структуре наликују на асемблерске, а постоје и изрази који непосредно позивају одговарајуће асемблерске инструкције. Тако, израз Програмски језик C је језик опште намене. Иако је развијан као „језик за системско програмирање”, подједнако добро се користи за писање значајних програма у различитим областима. C је такође веома утицао на многе друге популарне програме, посебно на C++, који је оригинално развијан као надградња C-а. K&R CБрајан Керниген (енгл. Brian Kernighan) и Денис Ричи (енгл. Dennis Ritchie) су 1978. објавили прво издање књиге Програмски језик C (енгл. The C Programming Language). Ова књига, позната 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 уводи неколико нових особина, од којих су многе већ биле имплементиране у неколико компајлера:
C је независан од конкретне архитектуре рачунарског система. Стандард чини све аспекте преносивости експлицитним. Подршка компајлераGCC и други C компајлери сада имају подршку за многе нове особине С99 стандарда. Ипак, постоји слабија подршка произвођача као што су Мајкрософт и Борланд који су се углавном концентрисали на С++, који обезбеђује слична функционална побољшања. Упркос значајној подршци за C99, GCC није потпуно сагласна имплементација стандарда; неколико кључних особина није имплементирано или не раде коректно[1]. Према тврдњама компаније Sun Microsystems, Sun Studio (који је бесплатан за преузимање) сада подржава комплетни С99 стандард[2]. Откривање (детекција) верзијеСтандардни макро #if __STDC_VERSION__ >= 199901L
/* "inline" је кључна реч */
#else
# define inline /* ништа */
#endif
ПрименаДенис Ричи је C оригинално створио и применио на UNIX оперативном систему на DEC-овом PDP-11. Оперативни систем, C компајлер и сви UNIX-ови апликативни програми су написани на C-у. Језик се након своје примарне употребе проширио на све сфере програмирања. Прославивши се својом брзином, постао је језик избора за многе будуће пројекте, попут различитих верзија Windows-а и UNIX-а, али и у апликативном програмирању за многобројне примене током деценија. И данас се користи у великој мери, првенствено за системско програмирање. Још једна последица широке прихваћености и ефикасности C-а је та да су компајлери, библиотеке и интерпретатори других програмских језика високог нивоа често написани на C-у. Организација језикаОрганизационе целине C-а су функције. Почетна тачка извршавања програма је тзв. „главна функција” (енгл. main), а целокупан програм се организује у одређени број других функција, у зависности од потребе. Функције се посматрају одвојеним, изолованим целинама чиме се постиже модуларност кода који је као такав лак за одржавање и даље развијање. Свака функција има свој именски простор и нема директан приступ променљивама других функција. Посредан приступ променљивама других функција је обезбеђен механизмом показивача и аргумената функције. Тело функције је ограничено витичастим заградама, како би јој се означили почетак и крај. Унутар функција делови кода могу бити одвојени у функцијске подблокове. Програм се извршава почев од прве линије кода функције main. Она може позивати друге функције или саму себе (види рекурзија). По завршетку функције main, читав програм се завршава и ослобађа из меморије. Уз стандардни C се дистрибуирају и стандардне библиотеке. То су датотеке које садрже мноштво корисних алата који се користе у свакодневном раду. Програмер може да укључи једну или више ових библиотека у свој програм, а може и сам да пише библиотеке за своје потребе. C операториC подржава богат скуп оператора. C има аритметичке операторе, операторе поређења (релацијске), логичке, битске (операторе за манипулисање битовима), операторе доделе, увећања и умањења за један, референцирања и дереференцирања, условни оператор, оператор промене типа (конверзије)… Оператор Пример Опис/Значење (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) Приоритет и асоцијативност оператора: Категорија Оператор Асоцијативност Постфикс () [] -> . ++ -- слева надесно Унарни ! ~ ++ -- + - * & (type) sizeof здесна налево Аритметички * / % слева надесно Аритметички + - слева надесно Померања << >> слева надесно Релациони < <= > >= слева надесно Једнакости == != слева надесно Битски AND & слева надесно Битски XOR ^ слева надесно Битски OR | слева надесно Логички AND && слева надесно Логички OR || слева надесно Условни ?: здесна налево Доделе = += -= *= /= %= >>= <<= &= ^= |= здесна налево Зарез , слева надесно ПримериОво је најмањи могући C програм. main() {
}
Пример који следи је кратак Hello World програм, написан на програмском језику C. Овај пример је постао модел за уводни пример за многе програмске језике. Штампа поруку „Zdravo svete”. #include <stdio.h>
/* укључујемо библиотеку која нам омогућава
рад са тастатуром и екраном */
int main(void) { /* започињемо функцију main */
printf("Zdravo svete\n"); /* користећи функцију printf из библиотеке
stdio.h, штампамо поруку на екран */
return 0; /* програм се завршава */
}
Сваки C програм се састоји из функција и променљивих. Прва линија програма Како функција #include <stdio.h>
int main(void) {
printf("Dobar ");
printf("dan.");
printf("\n");
return 0;
}
Можемо приметити да када желимо да пређемо у нови ред, користимо посебни знак Контролне структуреПрограм се извршава инструкцију по инструкцију, почевши од прве а завршавајући се последњом инструкцијом функције main. Програм се може завршити и раније, користећи кључну реч ГранањеПошто се програм увек позива у другачијем окружењу (другачије вредности променљивих, другачији систем на коме се програм извршава, моменат извршавања и жеље корисника програма), постоји потреба да се у зависности од одређених услова изврше различите инструкције. Операција гранања представља инструкцију да се под одређеним условима изврши један блок инструкција, под другим условима други итд. Постоје две начина имплементирања оваквог понашања: користећи контролну структуру
if ( n < 10 ) {
printf( "n је мање од 10" );
} else {
printf( "n је веће или једнако 10" );
}
Ако је
switch ( n ) {
case 1: printf( "n је једнако један" );
break;
case 2: printf( "n је једнако два" );
break;
default: printf( "n није једнако ни један ни два" );
}
ПетљеПетље се користе у ситуацијама када је потребно да се одређени део кода извршава више пута. Саставни делови петље су услов петље и блок петље — док је услов тачан, блок петље се понавља. Када задати услов постане нетачан, понављање се прекида и програм наставља са извршавањем. Постоје и петље код којих се блок кода понавља све док је одређени услов нетачан. Када постане тачан, понављање се прекида. У програмском језику C постоје следеће врсте петљи:
Синтакса while (izraz)
iskaz;
У овој петљи се израчунава израз. Ако вредност израза није нула, исказ се извршава и израз се поново израчунава. Циклус се наставља све док израз не постане нула, а онда се излази из циклуса и извршавање се наставља после исказа. Синтакса do
iskaz;
while (izraz);
Док Синтакса for(izraz1;izraz2;izraz3)
iskaz;
Три компоненте ове петље су изрази. Најчешће су израз1 и израз3 позиви функција или додељивања, а израз2 је релациони израз. Било који од ова три дела може недостајати, чак и сва три. Горња izraz1;
while (izraz2){
iskaz;
izraz3;
}
Следи пример бесконачне петље: for(;;) {
...
}
Ова петља може бити прекинута нпр. наредбама Програмски језик C такође садржи наредбу goto labela;
...
labela: naredba;
У овом примеру, labela представља ознаку наредбе на коју се скаче коришћењем наредбе Врсте променљивихПосебан чланак: променљива. У програмском језику C, типови променљивих се деле на следеће:
Елементарни типовиЕлементарни типови променљивих се деле по различитим критеријумима. По врсти података које чувају деле се на следеће:
По количини меморије коју заузимају, а самим тим и по распону вредности, деле се на:
По могућности постојања негативних вредности, деле се на следеће:
Кључне речи за означавање типова се могу комбиновати, у зависности од тога којој групи, према различитим критеријумима, тип променљиве припада. unsigned long int x;
Реч Највеће и најмање вредности променљивих одређеног типа зависе од рачунара. Зато постоје системска заглавља НизовиНизови представљају сложене типове података, и базирају се на осталим типовима променљивих. Низови представљају скупине елемената истог типа обележене једним именом. Низ у C-у је увек једнодимензионалан и, традиционално, фиксне, статичке величине дефинисане у време компилације. (новији С90 стандард такође допушта и низове променљиве дужине.) Ипак, коришћењем Сваком елементу низа се може приступити преко његовог целобројног индекса, односно редног броја у низу. Индекси почињу редним бројем 0. Следи пример декларације и коришћења низа целих бројева: int niz[40]; /* декларишемо статички низ величине 40 */
int x;
x = niz[0]; /* променљивој x додељујемо вредност првог елемента низа */
Могу се направити низови променљивих било ког типа, укључујући све типове из набројане листе типова променљивих, али сви елементи у једном низу морају бити истог типа. Карактеристичност C-a је и његов однос према низовима и показивачима. Низови се у C-у имплементирају преко показивача. Запис Формално, Следи занимљива демонстрација могућности узајамне замене показивача и низова. Четири доделе су еквивалентне и свака представља тачан C код. Приметимо да последња линија садржи чудан код који има наизглед замењен положај индексне променљиве x[i]=1;
*(x+i)=1;
*(i+x)=1;
i[x]=1; /* чудно, али тачно: -{i[x]}- је еквивалентно -{*(i+x)}-*/
Ипак, морамо направити разлику између низовних и показивачких променљивих. Иако се име низа у већини израза конвертује у показивач (на његов први елемент), овај показивач сам по себи не заузима меморијски простор. Дакле, не може се променити оно на шта низ показује, и немогуће је доделити га низу. (Низови се ипак могу копирати коришћењем функције Типови које дефинише корисникКорисник дефинише своје типове користећи кључну реч Структуре, попут елементарних типова, могу бити прослеђиване као аргументи функција, могу бити мерене оператором /* дефинишемо тип 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 );
Показивачке променљивеПосебан чланак: показивач. Свака променљива декларисана у програмском језику C има своју меморијску адресу. Ту адресу можемо добити унарним оператором &. Оператор & се односи само на објекте у меморији — променљиве и елементе поља. Не може се применити на изразе, константе или Показивачи се у програмском језику C означавају знаком звездице ( int n = 2; /* декларација целобројне променљиве n са вредношћу 2 */
int *np; /* декларација показивача np који може да показује само на целобројне променљиве */
np = &n; /* додела адресе променљиве n показивачу np */
printf( "%d", *np ); /* штампање вредности променљиве n користећи показивач np */
Управљање меморијомЈедна од најбитнијих функција програмског језика је да обезбеди могућност руковања меморијом и објектима који су сачувани у меморији. C обезбеђује три различита начина да се алоцира (додели, резервише) меморија за објекте:
Сваки од ова три прилаза представља одговарајуће решење у различитим ситуацијама и има многобројне примене. Када је то могуће, аутоматска или статичка алокација су пожељније јер је управљање меморијом остављено компајлеру, што ослобађа програмера од могућности да направи грешку при алоцирању и ослобађању меморије. Ипак, многе структуре података се увећавају током извршавања програма, и како статичка алокација (и аутоматска алокација у С89 и С90 стандардима) треба да имају фиксирану величину у време компајлирања, постоје многе ситуације у којима је неопходна динамичка алокација. Кључне речиЈедан број речи, тзв. кључне речи, имају посебно значење у језику и зато се не могу користити као идентификатори. Кључне речи према C90 стандарду су: 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 Стандард C99 је увео и следеће кључне речи[3]: inline _Bool _Imaginary restrict _Complex У одређеним верзијама језика постоје и следеће (нестандардне) кључне речи: ada far near asm fortran pascal entry huge Имена која почињу знаком _ треба избегавати јер су резервисана за променљиве и функције из стандардне библиотеке. БиблиотекеПрограмски језик C користи библиотеке као основни начин проширивања своје функционалности. У C-у, библиотека је скуп функција. Свака библиотека обично има заглавље (header file), које садржи прототипове функција, садржаних у библиотеци, које може да користи програм, и декларацију специјалних типова података и макроа које користе ове функције. Да би програм користио библиотеку, мора да укључи заглавље библиотеке, и библиотека мора бити повезана (linked) са програмом. Најпознатија C библиотека је C стандардна библиотека, која је одређена ISO и ANSI C стандардима и укључена је у сваку C имплементацију. Функције, типови и макрои стандардне библиотеке су декларисани у стандардним заглављима: <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> Нова заглавља која је укључио стандард C99 су: <complex.h> <fenv.h> <inttypes.h> <stdbool.h> <stdint.h> <tgmath.h> Заглављу можемо приступити на следећи начин:
Још један познат скуп C библиотечних функција је онај намењен програмима које раде под UNIX-ом, посебно функција које обезбеђују интерфејс са кернелом. Ове функције су описане у различитим стандардима као што су POSIX и Single UNIX Specification. Како постоји велики број програма написаних у C-у, постоји велики број доступних библиотека. Библиотеке су често написане на C-у зато што C компајлери генеришу ефикасан објектни код. УтицајСинтакса C-a је имала велики утицај на велики број програмских језика који су настајали после њега. Тако, данас постоје следећи програмски језици који су, посредно или непосредно, преузели синтаксу од C-а: Често се због тога каже да је C „победио” у програмерском свету, при чему се мисли на Паскал, Кобол и друге како процедуралне тако и непроцедуралне програмске језике у време његовог настанка. Овакав епитет C дугује својој архитектури која омогућава велику брзину програма, али и великим новинама које је увео у свет програмирања што се тиче краткоће кода (оператори Види јошРеференце
Литература
Спољашње везе
|
Portal di Ensiklopedia Dunia