# C (programski jezik)

**C**
|  |
| Programska Paradigma:
 | Strukturalno Programiranje
 |
| Pojavio se:
 | između 1969 i 1973-će
 |
| Tvorac:
 | Dennis Ritchie i Brian Kernighan, AT&T Bell Labs
 |
| Sistem tipovanja:
 | statični, slabi
 |
| Glavne implementacije:
 | razne
 |
| Dijalekti:
 | mnogi
 |
| Utjecali:
 | B programski jezik
 |
| Utjecao na:
 | C++, Javu, C#
 |

**C programski jezik** spada u proceduralne programske jezike koji je razvijen u ranim 70-im godinama 20. vijeka. Autor ovog programskog jezika je Dennis Ritchie, no značajan doprinos nastanku C-a dali su Ken Thompson kao autor programskog jezika B i Martin Richards, autor programskog jezika BCPL. Dennis Ritchie je stvorio ovaj programski jezik za rješavanje praktičnih problema kodiranja sistemskih programa i jezgre operativnog sistema UNIX, koji je praktički u cijelosti napisan u **C**-u.

Programski jezik **C** dosta se mijenjao tokom godina te je u više navrata neformalno i formalno standardiziran. Prva važnija verzija poznata je pod nazivom "K&R C", što je engl. kratica prezimena dvaju autora najpoznatijeg C priručnika "The C Programming Language", a to su Brian Kernighan i Dennis Ritchie. Prvo izdanje te vrlo sažeto i precizno pisane knjige koje datira iz 1978. godine ujedno je de facto standardiziralo jezik u 70-ima. Drugo izdanje iz 1988. godine opisuje "ANSI C", standard kojeg je 1983. godine definirao američki nacionalni institut za standardizaciju, a koji je i danas najbolje podržan. Aktualni ISO/IEC standard skraćeno poznat kao "C99" podržava u cijelosti samo jedan manji dio komercijalnih proizvođača softvera.

Kao jedan od najvažnijih jezika u historiji komercijalne računarske industrije, **C** je do danas ostao jedini programski jezik prilagođen za sve računarske platforme, od malih sistema pa do mrežnih superračunara. Programi napisani u njemu vrlo su bliski načinu rada hardvera te u načelu zahtijevaju od programera dobro razumijevanje rada procesora, memorije, ulazno-izlaznih sklopova itd. No, rad s registrima procesora i adresiranje memorije apstrahirani su pomoću koncepta varijabli i pokazivača što uz eksplicitne kontrolne strukture i funkcije znatno olakšava programiranje u odnosu na izravno programiranje u masinskim jezicima.

Tokom 1980-ih, Bjarne Stroustrup zajedno s drugim istraživačima u Bell Labs proširuje **C** dodavajući sposobnosti objektno orijentiranog programiranja, a naziv ovog novog programskog jezika je C++. Nažalost, ta je 100%-na kompatibilnost ujedno i razlog što su problemi koje programiranje u **C**-u nosi sa sobom naslijeđeni u C++-u. Efikasno i sigurno programiranje u **C**-u vrlo je zahtjevna vještina koja traži višegodišnje iskustvo pa je stoga **C** jezik koji se ne preporučuje početnicima, posebice ako im programiranje nije primarni posao.

Mnogobrojni problemi vezani prije svega za upravljanje memorijom koje programer mora sam eksplicitno kodirati razlog su da je danas većina novih korisničkih aplikacija napisana u nekom modernijem jeziku koji ima ugrađeno automatsko upravljanje memorijom (engl. garbage collection), ne dopušta izravan rad s memorijom pomoću pokazivača te ima podršku za upravljanje kodom odnosno njegovom okolinom za vrijeme njegova izvođenja. Danas se relativno rijetko ukazuje potreba za pisanjem novih korisničkih aplikacija izravno u **C**-u, pa čak i u vrlo malim sistemima kao što su primjerice mobilni telefoni. Glavno područje njegove upotrebe su sistemski programi na strani poslužitelja (engl. servers), programi prevoditelji (engl. compilers) i jezgre operativnih sistema (engl. operating system kernels), gdje je potreba za najvećom mogućom brzinom izvođenja, efikasnom kontrolom resursa i izravnom kontrolom hardvera od primarne važnosti.

## Historija razvoja i inačice

Prvobitni razvoj **C** programskog jezika započinje izmedju 1969 i 1973 u AT&T Bell Labs, i po Dennis Ritchie-ju najkreativniji period je bio u toku 1972-ge godine. Nazvan je **C** jer su mnoge od njegovih karakteristika potekle od ranijeg programskog jezika zvanog **B**.

## Standardizacija

Svaki program napisan u C-u sadrži sledeće elemente:
Preprocesorski dio koji uključuje određene ranije utvrđene procedure i skup definicija postupaka kao što su:

* **stdio.h** - Mali fajl unutar kompajlera koji definiše osnove ulaza i izlaza.

* **Definisanje varijabli** -Utvrđivanje polja definisanosti svih varijabli koje se pojavljuju u određenoj funkciji (**int** cjelobrojni, **float** sa pokretnim zarezom -decimalni, te single, double, long, string, char i void) ovo je obavezno zbog toga što C program ima tu osobinu da za svaku varijablu unaprijed rezerviše određeni memorijski prostor (1, 2, 4, 8 bajta)
* **Glavna funkcija main** - Mora postojati u svakom C programu i često se definiše kao **void** što znači da ne vraća ništa tj. podaci ne idu u druge funkcije i podfunkcije.

* **Ostale funkcije** - Moraju se definisati po vrsti ulaznih i izlaznih varijabli i količini memorijskog prostora kojeg one zauzimaju. Obično se pozivaju iz funkcije main odakle i preuzimaju podatke (jedan ili više varijabli) i tu ih nakon obrade i vraćaju (samo jedna varijabla), što znači da svaka funkcija ima jedan ili više ulaza i samo jedan izlaz.

## Programski primjer

```
# include <stdio.h>

int main(void) {
	int a,b,c;
	scanf("%d %d",&a,&b);
        c=a+b;
	printf("%d\n",c);
	return 0;
}

```