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.