Jazyk C je jedním z nejvýznamnějších imperativních programovacích jazyků, který zásadně ovlivnil vývoj celého odvětví IT. Jazyk C je jednoduchý, expresivní a univerzální, vyznačuje se úsporností a určitým minimalizmem. Není specializovaný pro žádnou určitou oblast a lze jej využít jak k programování mikroprocesorů, tak i k implementaci informačních systémů. Byl poprvé představen v roce 1972 a jeho autory jsou Brian W. Kernighan a Dennis M. Ritchie. Jazyk C se symbioticky vyvíjel společně s Unixem a tato skutečnost je patrná dodnes – jádro i většina programů je napsána právě v C. V průběhu času byl jazyk C několikrát vylepšen a vzniklo i několik standardů, z nichž nejznámnější je standard ANSI 89. Jejich cílem bylo vytvořit „bezespornou a strojově nezávislou definici jazyka C“, což se splnit podařilo. Není tedy chybou považovat jazyk C za multiplatformní.
Jazyk C ideově vychází z jazyků BCPL (Martin Richards) a B (Ken Thompson), ke kterým přidává typy a strojově nezávislou adresovou aritmetiku, realizovanou ukazateli. Každý program v jazyce C se skládá z proměnných a funkcí (neobsahuje objekty). Vstupním bodem programů je speciální funkce main.
kód v jazyce C - Zobrazit
Jednoduchý program, který vypíše řetězec „Hello world!“ na standardní výstup, se skládá z těchto kroků:
Proměnná je smysluplně pojmenované umístění v paměti počítače. Název proměnné se označuje jako identifikátor. Ten se může skládat z písmen, čísel a podtržítek, začínat ale může pouze podtržítkem nebo písmenem. Klíčová slova nemohou být použita jako identifikátory a délka by neměla přesáhnout „rozumné meze“ (podle implementace 31 až 247 znaků).
Deklarací se rozumí zavedení nové proměnné do zdrojového kódu.
kód v jazyce C - Zobrazit
Ukazatel (pointer) je speciální primitivní datový typ, který si lze představit jako číslo jednoznačně určující paměťovou buňku. Ukazatel na typ A ukazuje na místo v paměti, kde je uložen typ A. Ukazatel sám o sobě nenese žádná data. Ukazatel se deklaruje pomocí hvězdičky, která se vloží za název datového typu proměnné:
kód v jazyce C - Zobrazit
Adresa na proměnnou se získá použitím operátoru &:
kód v jazyce C - Zobrazit
Hodnotu v paměti, na kterou ukazuje ukazatel, lze získat tzv. dereferencí, která se zapisuje jako hvězdička před ukazatelem:
kód v jazyce C - Zobrazit
Pro přístup k vnitřním datovým hodnotám nějaké struktury lze použít tyto dva ekvivalentní zápisy:
kód v jazyce C - Zobrazit
Pole v jazyku C není nic víc, než ukazatel na svůj první prvek. Jeho velikost se nastavuje při alokaci a za běhu ji nelze měnit (nic však nebrání pole zkopírovat do většího prostoru a dále rozšiřovat).
Rezervace souvislého paměťového prostoru na žádost programu se nazývá alokace. Během tohoto procesu požádá program operační systém o souvislý blok paměti o velikosti N, kde N je součin velikosti jednoho prvku (v bajtech) a požadovaného počtu prvků. Je-li takový souvislý blok k dispozici, je rezervován pro daný proces a program do něho může ukládat data. Tento prostor je pak třeba před ukončením uvolnit (i když to dnes udělá operační systém za programátora, není vhodné na to spoléhat). Alokace se provádí pomocí funkce malloc a velikost datového typu se zjistí použitím konstruktu sizeof.
Funkce malloc vrací beztypový ukazatel typu void *, takže je nutné jej před přiřazením přetypovat. Po alokaci je více než vhodné zkontrolovat výsledek této operace – může se stát, že počítači dojde paměť a program namísto elegantního ukončení spadne.
kód v jazyce C - Zobrazit
Dealokace paměti se provádí pomocí funkce free. Ihned po dealokaci se doporučuje nastavit ukazateli nějakou „neškodnou“ hodnotu, což nejlépe splňuje hodnota NULL.
kód v jazyce C - Zobrazit
| Název | Typ | Rozsah | Velikost (obvyklá) |
|---|---|---|---|
| (unsigned) char | znak | 0 až 255 | 1 bajt |
| signed char | znak | –128 až 127 | 1 bajt |
| (signed) short int | celé číslo | –32768 až 32767 | 2 bajty |
| unsigned short int | celé číslo | 0 až 65535 | 2 bajty |
| (signed) int | celé číslo | –2147483648 až 2147483647 | 4 bajty |
| unsigned int | celé číslo | 0 až 4294967295 | 4 bajty |
| float | reálné číslo | +/- 3.4e +/- 38 (cca 7 míst) | 4 bajty |
| double | reálné číslo | +/- 1.7e +/- 308 (cca 15 míst) | 8 bajtů |
| void | obecný typ | nemá | – |
| A * | ukazatel na A | nemá | 4 bajty |
V jazyce C se nachází i strukturované datové typy, které se dají skládat z primitivních a dalších strukturovaných typů. Tyto datové typy se označují jako struktury (nebo ještě obecněji jako záznamy (records)).
kód v jazyce C - Zobrazit
kód v jazyce C - Zobrazit
kód v jazyce C - Zobrazit
| Operátor | Typ | Význam | Příklad |
|---|---|---|---|
| + | aritmetický | součet dvou čísel | a = 1 + 4 |
| – | aritmetický | rozdíl dvou čísel | b = 5 – 2 |
| * | aritmetický | součin dvou čísel | c = 5 * 6 |
| / | aritmetický | podíl dvou čísel | d = 10 / 3 |
| % | aritmetický | zbytek po dělení dvou čísel | e = 12 % 5 |
kód v jazyce C - Zobrazit
kód v jazyce C - Zobrazit
Cyklus „while“ má tvar WHILE (výraz) příkaz. Nejprve se vyhodnotí výraz. Je-li nenulový, provede se tělo cyklu a výraz se znovu vyhodnotí. Takto se pokračuje, dokud je výraz nenulový. Cyklus while se používá zejména tam, kde není nutné provádět před spuštěním cyklu žádnou inicializaci.
kód v jazyce C - Zobrazit
Cyklus „do while“ má tvar DO příkaz WHLE výraz. Nejprve je vykonán příkaz, pak je vyhodnocena výraz. Je-li jeho výsledek nenulový, je příkaz vykonán znovu. Takto se pokračuje, dokud je výraz nenulový.
kód v jazyce C - Zobrazit
Cyklus „for“ má tvar FOR (inicializace, podmínka, operace) příkaz a je zobecněním cyklu while. Používá se především tam, kde je před spuštěním cyklu nutné provést nějakou inicializaci. Tím, že jsou všechny tři řídící výrazy v hlavičce, zvyšuje tento zápis přehlednost. Jeho hlavička obsahuje tři části:
kód v jazyce C - Zobrazit
Funkcí se rozumí podprogram, který může vracet návratovou hodnotu. Rozdělování kódu na menší celky vede k větší přehlednosti a lepší struktuře zdrojového kódu.
Deklarací se rozumí zavedení nové funkce do zdrojového kódu. Deklarace každé funkce by měla obsahovat návratovou hodnotu, seznam parametrů a jejich typů a identifikátor představující název funkce. Pokud funkce nemá žádné parametry, jako jediný parametr se explicitně uvádí void.
kód v jazyce C - Zobrazit
kód v jazyce C - Zobrazit
Zdrojový kód v jazyce C lze pro větší přehlednost rozdělit do více souborů. Každý takový soubor může obsahovat související funkce a proměnné. Každý soubor je kompilován zvlášť, čímž vzniká nespustitelný binární soubor (object file). Aby bylo možné v souborech používat nelokální symboly (proměnné, struktury, funkce, …) z jiných souborů, je nutné získat jejich deklarace. K tomuto účelu vznikají speciální soubory obsahující právě tyto deklarace. Nazývají se hlavičkové soubory (header files) a obvykle končí příponou .h. Před použitím všech symbolů musí být tyto symboly deklarovány.
Následující jednoduchý příklad čítače se skládá ze tří souborů:
kód v jazyce C - Zobrazit
kód v jazyce C - Zobrazit
kód v jazyce C - Zobrazit