na obsah klávesové zkratky na hlavní stránku na menu

Operátory

V tomto článku najdete krátký přehled různých operátorů, se kterými se setkáme v jazyce C.

Matematické operátory

V jazyce C nalezneme celkem pět základních matematických operátorů, které přesně kopírují pět základních matematických operací. Jde o sčítání, odčítání, násobení, dělení a modulo. Operátory mají následující symboly:

+
Operátor sčítání.
++
Speciální operátor, který zvýší hodnotu o jedna.
-
Operátor odčítání. Též unární mínus.
--
Speciální operátor, který sníží hodnotu o jedna.
*
Operátor násobení.
/
Operátor dělení. Tento operátor zastává funkci jak operátoru celočíselného dělení, tak i funkci dělení necelých čísel.
%
Operátor modulo celým číslem.

Operátor dělení si zaslouží malou poznámku. Jeho podoba je totiž daná vstupními typy parametrů. Je-li alespoň jeden ze vstupních parametrů neceločíselný, bude se počítat v desetinných číslech. V případě, že oba parametry jsou celočíselného typu, bude se počítat jako při dělení se zbytkem. Toto je velký rozdíl od Pascalu a při programování může způsobit velké potíže. V případě, že máme oba typy celočíselné a přesto chceme dělit v oboru reálných čísel, musíme některý z parametrů operátoru přetypovat.

int a = 3;
int b = 2;

float c = a/b; // výsledek bude 1.0!!
float d = (float)a/b; // výsledek bude 1.5, přetypování a

Operátory splňují standardní matematické priority operátorů. Tedy chceme-li např. dělit složitějším výrazem, je nutné výraz uzavřít do kulatých závorek, které mění prioritu.

float a = 3.0;
float b = 2.0;

float c = a/2*b; // výsledek bude 3.0, (3.0/2.0)*2.0!!
float d = a/(2*b); // výsledek bude 0.75, 3.0/(2.0*2.0)

Bitové operátory

V jazyce C je nepřímo možné pracovat s jednotlivými bity. Slouží k tomu bitové operátory.

&
AND – bitové násobení.
|
OR – bitové sčítání.
^
XOR – bitová non-ekvivalence.
~
bitová negace.
<<
bitový posun vlevo. Posune bity o zadaný počet vlevo a zprava doplní nuly
>>
bitový posun vpravo. Posune bity o zadaný počet vpravo. Zleva se doplní nuly, pokud posouváme neznaménkový typ, jinak se kopíruje nejvyšší bit (znaménko).

Bitové posuny jsou nesmírně cenným nástrojem, pokud potřebujeme rychle generovat mocniny dvou. V každé poziční soustavě je posun vlevo vždy roven násobení základem soustavy, v našem případě dvěma.

int a = 1 << 2; // v a bude binárně 100, tedy 4

int b = 3 << 3; // b binárně 11 se posune doleva na 11000, tedy na 24

Jedním z možných použití bitových operátorů je testování sudosti nebo lichosti čísla. Porovnejme dva přístupy:

int a = 5;

if ((a % 2) == 0)
printf("cislo je sude");
else
printf("cislo je liche");

if ((a & 1) == 0)
printf("cislo je sude");
else
printf("cislo je liche");

Na první pohled se nic nezměnilo. V podmínkách se ale testují jiné výrazy. V prvním případě se provede modulo dvěma a testujeme, zdali je výsledek nula. Ve druhém případě provedeme logický AND s jedničkou, fakticky se tak ptáme, jestli je nejnižší bit čísla jedna, nebo nula, a testujeme, zdali je výsledek nula. Druhý způsob se může zdát složitý, ale je výpočetně mnohem rychlejší než první způsob.

Operátory porovnávání

Jedno z nejčastějších operací v podmíněných výrazech je různorodé porovnávání. K porovnávání slouží řada operátorů, které svým zápisem odpovídají operátorům v Pascalu.

>
Operátor ostře větší než.
>=
Operátor větší než nebo rovno.
<
Operátor ostře menší než.
<=
Operátor menší než nebo rovno.
==
Operátor rovnosti. Neplést s operátorem přiřazení, který se píše jen s jedním rovnítkem!
!=
Operátor nerovnosti.
&&
logické AND. Vrátí pravda pouze, pokud jsou oba operandy pravdivé.
||
logické OR. Vrátí pravda, pokud je alespoň jeden operand pravdivý.
!
logické NOT. Otočí pravdivostní hodnotu vstupního operandu.

Speciálně u porovnávání je nutné se mít na pozoru a nezaměnit dvě rovnítka za jedno, neboť kód bude syntakticky správně, ale výsledek bude zcela odlišný od zamýšleného. Také je nutné neplést si bitové a logické operátory, každá skupina slouží jinému účelu.

Zkrácený zápis

Návrh jazyka C je minimalistický a snaží se ušetřit všude, kde jen to jde. Podívejme se na následující kód:

int a;
// ...
a = a + 2;

Zde přiřazujeme do proměnné a původní hodnotu zvýšenou o dva. Protože jde neustále o tu samou proměnnou, je takový zápis zbytečně redundantní. Ekvivalentně lze poslední příkaz zapsat takto:

int a;
// ...
a += 2;

Nejde o nic jiného než o zkrácenou formu výše popsaného příkazu. Všechny binární operátory v jazyce C lze takto zkrátit.