C (programovací jazyk)

Príklad "hello, world"

Nasledujúca jednoduchá aplikácia sa objavila v prvom vydaní K&R, a stala sa štandardným úvodným programom väčšiny kníh zaoberajúcich sa výučbou programovania, nezávisle od použitého jazyka.
Program vypíše "hello, world" na štandardný výstup, čo je zvyčajne terminál alebo obrazovka počítača. Môže to však byť aj súbor alebo nejaké iné hardvérové zariadenie, v závislosti od toho, ako je mapovaný štandardný výstup v čase vykonania programu.
main(){
  printf("hello, world\n");}
Hore uvedený program sa korektne skompiluje na väčšine moderných kompilátorov, ktoré nie sú v kompatibilnom režime. Kompilátory podľa štandardu ANSI C však vypíšu niekoľko varovných hlásení. Navyše sa kód neskompiluje, ak kompilátor striktne dodržiava štandard C99, keďže návratová hodnota typu int sa nedoplní. Tieto hlásenia je možné eliminovať niekoľkými malými zmenami originálneho programu:
#include <stdio.h>int main(void){
  printf("hello, world\n");
  return 0;}
Nasleduje analýza už uvedeného programu po jednotlivých riadkoch:
#include <stdio.h>
Prvý riadok programu je direktíva preprocessora #include. Hovorí preprocesoru – prvému nástroju, ktorým prechádza zdrojový kód počas kompilácie – aby nahradil uvedený riadok celým textom súboru alebo inou entitou, na ktorú odkazuje. V tomto prípade sa riadok nahradí hlavičkovým súborom stdio.h, ktorý obsahuje deklarácie funkcií štandardného vstupu a výstupu. Lomené zátvorky okolo stdio.h naznačujú, že súbor je možné nájsť na jednom z miest, ktorých zoznam preprocesoru dávame pomocou search path pre hlavičkové súbory.
int main(void)
Tento ďalší riadok hovorí, že definujeme funkciu zvanú main. Funkcia main má v jazyku C špeciálny význam. Po spustení programu je main prvá funkcia, ktorá sa volá. int znamená, že návratová hodnota – hodnota, na ktorú sa vyhodnotí funkcia main – je typu integer. (void) znamená, že funkcia main neočakáva argumenty od kódu, ktorý ju volá. Pozri aj void.
{
Táto ľavá zložená zátvorka označuje začiatok bloku funkcie main.
  printf("hello, world\n");
Tento riadok volá funkciu s názvom printf (odovzdá riadenie jej kódu), ktorá bola deklarovaná vo vloženom hlavičkovom súbore stdio.h. Počas tohto volania sa funkcii printf poskytne jediný argument, reťazcový literál "hello, world\n". Jeho časť \n je tzv. escape sekvencia, ktorá sa preloží na znak EOL, end-of-line, ktorý posunie kurzor v termináli na začiatok nasledujúceho riadku. Návratová hodnota funkcie printf je typu int, ale volajúci kód ju nepoužíva, a preto sa ignoruje.
  return 0;
Tento riadok ukončuje vykonávanie funkcie main a priraďuje jej návratovej hodnote nulu.
}
Táto pravá zložená zátvorka označuje koniec bloku funkcie main.

Ukazovatele (smerníky, pointery)

C veľmi často využíva smerníky (ukazovatele, pointery), veľmi jednoduchý typ odkazu, ktorý ukladá adresu pamäťového miesta. Premenná, ktorá reprezentuje pointer na hodnotu sa deklaruje so znakom * pred názvom premennej. Pointer je možné dereferencovať (pomocou operátora *), aby sa sprístupnili údaje uložené na danej adrese. Adresu je možné meniť bežným priradením a aritmetikou ukazovateľov.
Adresu ľubovoľnej premennej (ale aj funkcie) je možné získať použitím operátora získania adresy (&). Výsledkom je pointer na typ premennej s hodnotou adresy premennej, v prípade funkcií je to adresa funkcie. Príklad zaobchádzania s pointermi:
Definujeme celočíselné premenné s názvami A a B:
  int A, B;
Nastavíme hodnotu premennej A na hodnotu 5:
  A = 5;
Definujeme premnennú s názvom pA typu pointer na celočíselnú premennú:
  int *pA;
Hodnoty premenných budú po tomto kroku nasledovné:
  A = 5
  B = <náhodná hodnota>
  pA = <náhodná adresa>
Priradíme adresu premennej A do premennej pA. Získanie adresy sa uskutoční operátorom &:
  pA = &A;
Hodnoty premenných budú po tomto kroku nasledovné:
  A = 5
  pA = <adresa premennej A>
Priradíme hodnotu na ktorú odkazuje premenná pA do premennej B. Keďže premenná pA obsahuje ADRESU premennej A, musíme získať hodnotu na tejto adrese. To docielime dereferencovaním adresy uloženej v premennej pA na hodnotu pomocou operátora *.
 
  B = *pA;
Hodnoty premenných budú po tomto kroku nasledovné:
  A = 5
  pA = <adresa premennej ''A''>
  *pA = 5
  B = 5
Zmeníme hodnotu premennej A na hodnotu 10:
  A = 10;
Keďže premenná pA ukazuje na premennú A, táto zmena sa prejaví aj pri dereferencovaní premennej pA. Premenná B však obsahuje priamo hodnotu 5, teda táto zmena sa jej nedotkne:
  A = 10
  pA = <adresa premennej ''A''>
  *pA = 10
  B = 5
Počas behu programu, ukazovateľ predstavuje pamäťovú adresu. V čase kompilácie je to zložený typ reprezentujúci adresu aj typ údajov. To umožňuje typovú kontrolu pointerov. Pointery sa v jazyku C používajú na rozličné účely, napríklad textové reťazce s premenlivou dĺžkou sú bežne reprezentované pointerom na prvý znak reťazca. Dynamická alokácia pamäte, ktorá je popísaná nižšie, sa uskutočňuje pomocou pointerov.
Null pointer je vyhradená hodnota, ktorá neukazuje na platné pamäťové miesto (respektíve ukazuje na neexistujúce miesto v pamäti). Je užitočná na indikáciu špeciálnych prípadov ako pointer na ďalší uzol posledného uzla spojového zoznamu. Dereferencovanie null pointera spôsobuje nepredvídateľné správanie (najčastejšie chybu programu a jeho ukončnie). Pointery na typ void tiež existujú a ukazujú na objekty neznámeho typu. To je obzvlášť užitočné pri generickom programovaní . Keďže veľkosť a typ objektov, na ktoré ukazujú nie je známy, nie je možné ich dereferencovať, ale je možné ich konvertovať na iné typy pointerov pomocou pretypovania.

Pretypovanie

C sa často používa na nízkoúrovňové systémové programovanie, kde môže byť potrebné zaobchádzať s celým číslom ako s pamäťovou adresou, reálnym číslom s dvojitou presnosťou ako s celočíselným typom alebo s jedným typom pointera ako s iným. Pre tieto prípady C poskytuje pretypovanie, ktoré vynúti explicitnú typovú konverziu hodnoty z jedného typu na druhý. Použitie pretypovania znamená čiastočné obetovanie typovej bezpečnosti. Pretypovanie sa uskutočňuje uvedením požadovaného typu do okrúhlych zátvoriek pred hodnotu, ktorú chceme pretypovať:
  float desatinneCislo = 5.6F;
  int celeCislo = (int) desatinneCislo;
Mimo explicitných konverzií je prekladač schopný poskytnúť aj tzv. implicitnú typovú konverziu medzi blízkymi typmi. Oproti iným, silnejšie typovaným jazykom ako Java alebo C# je práve pomerne flexibilná implicitná konverzia zdrojom mnohých chýb v kóde. Nasledovný kód je platný, pretože sa uplatňuje implicitná konverzia z rozmerovo menších typov na rozmerovo väčšie:
  double  d;
  long    l;
  int     i;
 
  if (d > i)
    d = i;
  if (i > l)
    l = i;
  if (d == l)
    d *= 2;

Syntax

Na rozdiel od jazykov ako Fortran 77 má C voľnú formu, čím umožňuje programátorovi používať tzv. biele znaky (whitespaces) na grafickú úpravu zdrojového kódu. Komentáre je možné vkladať buď uzatvorením medzi /* a */ alebo vložením // na začiatok riadku (podporované v norme C99).
Každý zdrojový súbor obsahuje deklarácie a definície funkcií. Definície funkcií zasa obsahujú definície premenných a príkazy. Definície premenných buď definujú nové typy pomocou kľúčových slov ako struct, union a enum, alebo priraďujú typ a úložný priestor pre nové premenné, zvyčajne napísaním názvu typu nasledovaného názvom premennej. Kľúčové slová ako char a int, ako aj symbol pointera *, predstavujú vstavané typy. Časti kódu uzatvorené v zložených zátvorkách { a } indikujú rozsah, na ktorý sa vzťahujú definície a riadiace štruktúry.
Príkazy vykonávajú činnosti ako zmena hodnoty premennej alebo výstup textu. Riadiace štruktúry slúžia na podmienené alebo cyklické vykonávanie a skladajú sa z kľúčových slov ako if, else, switch, while, do while, for a takmer ľubovoľné skoky sú možné použitím goto. Činnosť cyklov môžeme ovplyvniť pomocou break a continue. Rôzne vstavané operátory vykonávajú základné aritmetické, logické, porovnávacie, bitové operácie, operácie na indexovanie polí a priradenie. Príkazy tiež môžu volať funkcie, vrátane veľkého množstva štandardných knižničných funkcií vykonávajúcich bežné úlohy.

Príklad programu

#include <stdio.h>int main(void) {
  for (int i = 0; i < 5; i++) {
    printf("i = %d\n", i);
  }
  return 0;}
Každý program v jazyku C musí obsahovať funkciu main, ktorá vracia celočíselnú hodnotu. Ak program prebehol bez chýb, main vracia hodnotu 0.
Tento program demonštruje cyklus for. Používa premennú i, ktorá má počiatočnú hodnotu 0 a táto hodnota sa v každom opakovaní cyklu zväčšuje o 1. Na začiatku každého behu cyklu sa testuje podmienka, či i je menšie ako 5. Ak je táto podmienka splnená, telo cyklu prebehne, ináč sa cyklus skončí. Z toho jasne vyplýva, že náš cyklus bude mať 5 opakovaní. Pre názornosť sa zakaždým vypíše aktuálna hodnota premennej i.
Pozn.: deklarácia premennej vnútri for(;;) vyžaduje prekladač s podporou štandardu C99.
Výstup programu:
i = 0
i = 1
i = 2
i = 3
i = 4