Studijní materiály
EXTRA Přihlásit Kontakt

Operátory v jazyce C

Operátor je znak (nebo dvojice znaků), který říká, co se má s hodnotami udělat. Jazyk C jich má víc než většina jazyků – kromě běžného počítání umí pracovat i s jednotlivými bity. Zde je přehled operátorů rozdělených podle toho, k čemu slouží:

Aritmetické operátory

Slouží k počítání s čísly: + (sčítání), - (odčítání), * (násobení), / (dělení) a % (zbytek po dělení, tzv. modulo). Pozor na dělení dvou celých čísel – výsledek je opět celé číslo a desetinná část se zahodí.

int a = 7, b = 2;

printf("%d\n", a + b);   // 9
printf("%d\n", a / b);   // 3  (ne 3.5 – oba operandy jsou int)
printf("%d\n", a % b);   // 1  (zbytek po dělení)
printf("%f\n", (float) a / b);   // 3.500000 (přetypování na float)

Relační operátory

Porovnávají dvě hodnoty a vracejí 1 (pravda), nebo 0 (nepravda): == (rovná se), != (nerovná se), <, >, <= a >=. Nejčastější začátečnická chyba je zaměnit == za =, což není porovnání, ale přiřazení.

int vek = 18;

if (vek >= 18) {
    printf("Plnoletý\n");
}

Logické operátory

Spojují podmínky dohromady: && (a zároveň), || (nebo) a ! (negace). Vyhodnocují se zkráceně – jakmile je výsledek jistý, zbytek výrazu se už neprovede.

int vek = 20, ma_prukaz = 1;

if (vek >= 18 && ma_prukaz) {
    printf("Může řídit\n");
}

if (!ma_prukaz) {
    printf("Nemá průkaz\n");
}

Bitové operátory

Pracují s jednotlivými bity čísla: & (AND), | (OR), ^ (XOR), ~ (negace všech bitů), << (posun bitů doleva) a >> (posun doprava). Posun o jeden bit doleva odpovídá vynásobení dvěma, posun doprava dělení dvěma.

unsigned char x = 12;   // 0000 1100
unsigned char y = 10;   // 0000 1010

printf("%d\n", x & y);    // 8   0000 1000
printf("%d\n", x | y);    // 14  0000 1110
printf("%d\n", x ^ y);    // 6   0000 0110
printf("%d\n", x << 1);   // 24  0001 1000

Přiřazovací operátory

Základní = uloží hodnotu do proměnné. Složené operátory +=, -=, *=, /=, %= (a jejich bitové obdoby) zkracují zápis, kdy se proměnná mění podle své vlastní hodnoty.

int soucet = 10;

soucet += 5;    // totéž jako soucet = soucet + 5;  → 15
soucet *= 2;    // 30
soucet /= 3;    // 10

Inkrementace a dekrementace

Operátory ++ a -- zvětší nebo zmenší hodnotu o jedničku. Záleží, kde je napíšeme: v prefixové podobě (++i) se proměnná změní ještě před použitím hodnoty, v postfixové (i++) až po něm.

int i = 5;

printf("%d\n", i++);   // vypíše 5, teprve pak je i = 6
printf("%d\n", ++i);   // i = 7 a vypíše 7

Ternární operátor

Zkrácený zápis podmínky ve tvaru podmínka ? hodnota_když_platí : hodnota_když_neplatí. Hodí se tam, kde by celý if byl zbytečně dlouhý.

int a = 8, b = 3;
int vetsi = (a > b) ? a : b;   // vetsi = 8

Operátor sizeof

Vrátí velikost typu nebo proměnné v bajtech. Výsledek závisí na konkrétní platformě, proto se nikdy nespoléhej na to, že int má vždycky 4 bajty – zeptej se pomocí sizeof.

printf("%zu\n", sizeof(int));      // typicky 4
printf("%zu\n", sizeof(double));   // typicky 8

int pole[10];
printf("%zu\n", sizeof(pole) / sizeof(pole[0]));   // počet prvků: 10

Priorita operátorů

Operátory se vyhodnocují v pevném pořadí: nejdřív ++, -- a !, pak násobení a dělení, pak sčítání a odčítání, dál porovnávání, logické operátory a úplně nakonec přiřazení. Když si prioritou nejsi jistý, napiš závorky – kód je s nimi čitelnější a nic to nestojí.

int vysledek = 2 + 3 * 4;       // 14, ne 20
int jasnejsi = 2 + (3 * 4);     // totéž, ale je vidět záměr