Modifikátory jsou klíčová slova, která se píšou před datový typ a upřesňují, jak velký rozsah hodnot proměnná pojme a co se s ní smí dělat. Díky nim se dá ze stejného základního typu udělat úspornější, nebo naopak větší proměnná:
Modifikátory short a long mění velikost celočíselného typu. short int má alespoň 16 bitů, long int alespoň 32 bitů a long long int alespoň 64 bitů. Slovo int se přitom může vynechat – long x; a long int x; znamená totéž.
short int maly = 32000;
long int velky = 2000000000L;
long long int hodne_velky = 9000000000LL;
printf("%zu %zu %zu\n", sizeof(short), sizeof(long), sizeof(long long));
Modifikátor signed znamená, že typ pojme kladná i záporná čísla (to je výchozí stav), unsigned naopak jen nezáporná. Tím se rozsah posune: znaménkový osmibitový typ zvládne −128 až 127, bezznaménkový 0 až 255. Bezznaménkové proměnné se hodí tam, kde záporná hodnota nedává smysl – třeba počet prvků.
signed char teplota = -15;
unsigned char jas = 250;
unsigned int pocet = 0;
pocet--; // pozor: nepřeteče do -1, ale na největší možnou hodnotu
Přesné velikosti nejsou v jazyce C pevně dané, norma určuje jen minimum. Na běžném 64bitovém počítači to obvykle vypadá takto:
char 1 bajt -128 .. 127
unsigned char 1 bajt 0 .. 255
short 2 bajty -32 768 .. 32 767
unsigned short 2 bajty 0 .. 65 535
int 4 bajty -2 147 483 648 .. 2 147 483 647
unsigned int 4 bajty 0 .. 4 294 967 295
long 8 bajtů zhruba -9,2 . 10^18 .. 9,2 . 10^18
long long 8 bajtů stejně jako long
Konstanty s přesnými hranicemi najdeš v hlavičkovém souboru <limits.h>, například INT_MAX nebo UCHAR_MAX.
#include <stdio.h>
#include <limits.h>
int main(void) {
printf("int: %d .. %d\n", INT_MIN, INT_MAX);
printf("char: %d .. %d\n", CHAR_MIN, CHAR_MAX);
return 0;
}
Kvalifikátor const říká, že se hodnota proměnné po inicializaci nesmí změnit. Překladač pak pokus o změnu odmítne, takže se chyba najde už při překladu, ne až za běhu programu.
const double PI = 3.14159265;
// PI = 3; // chyba při překladu: assignment of read-only variable
Uvnitř funkce znamená static proměnnou, která si mezi voláními pamatuje svou hodnotu a vytvoří se jen jednou. Mimo funkci naopak omezí platnost proměnné nebo funkce na jediný zdrojový soubor.
void pocitadlo(void) {
static int volani = 0; // vytvoří se jen při prvním průchodu
volani++;
printf("Voláno %d.\n", volani);
}
Slovo extern oznamuje, že proměnná je definovaná v jiném zdrojovém souboru. Sám o sobě nic nevytváří, jen na existující proměnnou odkazuje – používá se hlavně v hlavičkových souborech.
// soubor main.c
int pocet_uzivatelu = 42;
// soubor statistiky.c
extern int pocet_uzivatelu; // proměnná bydlí jinde
Kvalifikátor volatile zakazuje překladači optimalizovat přístupy k proměnné, protože její hodnotu může změnit něco mimo program – typicky hardware nebo obsluha přerušení. Mimo programování mikrokontrolérů se používá zřídka.
volatile int stav_tlacitka;