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ží:
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)
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");
}
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");
}
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
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
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
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
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
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