Výrazy a operátory
Výrazy slouží k výpočtu hodnoty. Skládájí se z operátorů a operandů. Chceme např. vypočítat součet. V tom případě je operátorem znak +. Dále potřebujeme operandy, to jsou čísla nebo proměnné, které budeme sčítat.
Dělení operátorů:
- podle funkce - aritmetické, logické, bitové, ...
- podle počtu operandů - unární (potřebují jeden operand), binární (dva operandy) a ternární (tři operandy)
Poznámka: operátor + je binární, protože pro sčítání potřebujeme dvě hodnoty. Operátor ! (negace) je unární, pracuje jen s jedním operandem.
operátory
Aritmetické operátory:
+ - * / %
Jedná se o operátory pro základní aritmetické operace + (sčítání), - (odčítání), * (násobení), / (dělení) a % (modulo - zbytek po celočíselném dělení). Všechny jsou binární.
Při použití aritmetických operátorů +, -, *, / je typ výsledku určený typem operandů: pokud se jedná o celá čísla, bude taky výsledek celočíselný. Pokud alespoň jeden operand bude reálná hodnota, výsledek bude taky reálné číslo. "Nečekané" výsledky můžeme dostat hlavně pro operátor dělení, tam je potom třeba vhodně zvolit datové typy podle očekávaného výsledku. Operátor % můžeme použít jenom pro celá čísla, jinak nemá smysl.
Relační a logické operátory:
< <= > >= == !=
&& || !
Relační operátory používáme pro porovnávání dvou hodnot. Logické operátory používáme v následujícím významu: && jako logický součin (and, platí zároveň), || jako logický součet (or - nebo), ! jako negaci (not).
Výsledkem výrazů, které obsahují relační nebo logické operátory, je logická hodnota pravda/nepravda (platí/neplatí). V jazyce C není speciální datový typ pro logické hodnoty. Logickou hodnotu nepravda představuje číslo 0, jakékoliv jiné celé číslo (často 1) znamená hodnotu pravda.
Např. výraz x >= 0 bude vyhodnocen jeko nepravda pro všechny záporné hodnoty proměnné x, t.j. jeho výsledkem bude 0. Pro kladné hodnoty a nulu bude vyhodnocen jako pravda, t.j. jeho výsledkem může být 1 .
Operátory inkrementace a dekrementace:
++ --
Operátor umožní přičíst nebo odečíst 1. Používá se v zápisu před proměnnou (++x) nebo za proměnnou (x++), jejich vyhodnocení uvnitř složitějších výrazů se liší.
Operátory přiřazení:
= += -= *= /=
Základním operátorem přiřazení je =. Používá se přiřazení hodnoty z pravé strany do proměnné na levé straně operátora. Základní informace o přiřazovacím přikaze najdete v kapitole Proměnné. Použití dalších operátorů nám přiblíží následující příklad.
a += x; // a = a + x;
b *= 5; // b = b * 5;
Bitové operátory:
<< >> & | ~ ^
Bitové operace využijeme při operacích s čísly na bitové úrovni (bit po bitu). Jejich význam je: << - bitový posun doleva, >> - bitový posun doprava, & - bitový součin, | - bitový součet, ~ - bitová negace, ^ - bitová nonekvivalence (xor).
Podmíněný ternární operátor:
(logický výraz) ? výraz1 : výraz2
Pokud je pravdivý logický výraz, výsledkem je výraz1, jinak je výsledkem výraz2. V praxi se místo podmíněného operátoru častěji používá podmíněný příkaz if.
Přetypování: (typ)
Jazyk C je přísně typový jazyk, každá proměnná má v deklaraci určený datový typ a ten se při běhu programu nemění. Můžeme ale v případě potřeby změnit typ hodnoty ve výrazu, to se děje při přetypování.
K automatickému (implicitnímu) přetypování dochází nejčastěji při vyhodnocování aritmetických výrazů, např. když celočíselnou hodnotu vložíme do proměnné typu float (reálné číslo).
Někdy potřebujeme hodnotu "řízeně" přetypovat. Jedná se o programátorem vynucené (explicitní) přetypování. To provedeme uvedením potřebného datového typu v závorkách před hodnotou, kterou chceme přetypovat. Přetypování nemůžeme provádět libovolně, má svá pravidla. Nejbezpečnější je převádět hodnoty z vyššího typu na nižší (např. int na float), v tom případě nedochází ke ztrátě informací.
int a = 13, b = 5, c;
float x;
c = a / b; // výsledkem je 2
// a, b jsou celá čísla, jedná se o celočíselné dělení
x = a / b; // výsledkem je 2.00, automatické přetypování
// a, b jsou celá čísla, jedná se pořád o celočíselné dělení
// výsledek se vloží do reálné proměnné
x = (float)a / b; // výsledkem je 2.60
// a je přetypováno na float, jedná se o reálné dělení
vyhodnocování výrazů
Při vyhodnocování výrazů je důležitá priorita jednotlivých operátorů, ta je v každém programovacím jazyku přesně nastavena. Priorita určuje, který operátor má při zpracování přednost. Když si není programátor jistý pořadím operací, může při zápisu výrazů vhodně použít závorkování. V jazyce C používáme pro tento případ jenom obyčejné závorky, které můžeme do sebe vkládat.
Priorita operátorů (od nejvyšší) je uvedena v následující tabulce. Jsou v ní uvedeny taky operátory, kterých význam bude popsán až v dalších kapitolách.
Priorita | Operátory | Poznámka |
---|---|---|
1 | ( ) [ ] -> . | nejvyšší prioritu mají závorky |
2 | ! ~ ++ -- - * & sizeof | znaménko - u čísla, unární & a * |
3 | * / % | |
4 | + - | |
5 | << >> | |
6 | < <= > >= | |
7 | == != | |
8 | & ^ | | binární |
9 | && | |
10 | || | |
11 | ? : | ternární |
12 | = += -= *= /= | a další přiřazovací operátory |
Při vyhodnocování operací se stejnou prioritou rozhoduje směr vyhodnocování - postupné vyhodnocování zleva.