Obsah

Operátory

operátoři

S čísly lze v Javě provádět běžné aritmetické operace: sčítání, odčítání, násobení, dělení, modulo (zbytek po celočíselném dělení). K zápisu operací slouží operátory. unární mínus Např. sčítání zapisujeme pomocí operátoru + a modulo pomocí operátoru %. Zápis x + 2 je tedy zápisem operace sčítání. Každý operátor pracuje s jednou či více hodnotami nebo proměnnými, kterým říkáme operandy. binární operátor děleno Podle počtu operandů můžeme operátory rozdělit na unární (s jedním operandem), binární (se dvěma operandy) a ternární (se třemi operandy). Unárním operátorem je např. ++ (inkrementace) a binárním operátorem je např. = (přiřazení). Jediným ternárním operátorem je ?: (podmíněný operátor). Výsledkem provedení operátoru je hodnota (říkáme, že operátor vrací hodnotu). operátory Např. binární operátor + (sčítání) vrací součet svých operandů. Typ výsledku závisí na operátoru a někdy i na operandech. U operátorů, které vrací celočíselnou hodnotu, je výsledek buď int nebo long. Např. sečteme-li dvě hodnoty typu int, výsledek bude int, sečteme-li dvě hodnoty typu long, výsledek bude long, a sečteme-li dvě hodnoty typu byte, bude výsledek int. Operátor / (děleno) vrací pro celočíselné operandy celočíselný podíl. Např. 15 / 4 je 3 a −15 / 4 je −3. Je-li hodnota druhého operandu 0, nastane chyba. operátor modulo Je-li alespoň jeden operand reálný (tj. float nebo double), je i druhý operand převeden na reálný, a operátor děleno vrátí podíl obou operandů. Např. 4.5 / 3 je 1.5. Je-li druhým operandem 0, bude výsledkem reálného dělení některá z těchto hodnot: plus nekonečno, je-li první operand kladný, mínus nekonečno, je-li druhý operand záporný, nebo NaN (Not a Number), je-li první operand kladné nekonečno, záporné nekonečno, NaN či 0. Operátor % (modulo) vrací zbytek po celočíselném dělení. Např. 17 % 4 je 1. Tento operátor je definován i pro záporné hodnoty, ovšem jinak než tomu bývá v matematice. Znaménko výsledku je vždy stejné jako znaménko prvního operandu: −17 % 4 je −1, 17 % −4 je 1 a −17 % −4 je −1.

asociace zleva doprava Operátory lze řetězit, tj. lze zapisovat výrazy, které obsahují více operátorů. Např. x + 2 * y je výraz, který obsahuje operátory sčítaní a násobení. Pořadí vyhodnocování operátorů určuje priorita operátorů (angl. precedence). Např. ve výrazu x + 2 * y se provede nejprve násobení a pak sčítání, protože operátor násobení má vyšší prioritu než operátor sčítání. Jiné pořadí vyhodnocení lze předepsat závorkami: (x + 2) * y. Použijeme-li ve výrazu více operátorů se stejnou prioritou, rozhoduje o pořadí vyhodnocování asociativita operátoru (angl. asociativity). Např. ve výrazu x − y − z se provede nejprve x − y a poté se od výsledku odečte z. Říkáme, že operátor odčítání asociuje zleva doprava. Výraz x − y − z má tedy stejnou hodnotu jako výraz (x − y) − z.

asociace zprava doleva Některé operátory mají asociativitu opačnou, tj. zprava doleva. Příkladem je operátor přiřazení. Návratovou hodnotou tohoto operátoru je hodnota levého operandu po přiřazení. Ve výrazu x = y = 1 se provede nejprve přiřazení y = 1 a poté se návratová hodnota operátoru (v tomto případě 1) přiřadí do x. Výraz x = y = 1 se tedy vyhodnocuje stejně jako x = (y = 1).

Úloha 1

Doplňte kód.

Úloha 2

a, b jsou odvěsny pravoúhlého trojúhelníka. Doplňte kód tak, aby vytiskl velikost přepony.

Úloha 3

Doplňte kód tak, aby se vytiskl největší celočíselný násobek y, který není větší než x.

Úloha 4

Určete, co se vytiskne.

Úloha 5

Určete, jaká hodnota se vytiskne.

Úloha 6

Určete hodnotu proměnné d.

Úloha 7

Spočtěte a vytiskněte hodnotu polynomu 2x2-3x+1 v bodě x.

Úloha 8

Doplňte chybějící kód.

Úloha 9

Určete, co se vytiskne.

Otázky a odpovědi

Studentka: Teď už vím, že každý operátor vrací nějakou hodnotu a že tuto hodnotu můžeme dále použít. Není mi však jasné, co se stane s návratovou hodnotou v tomto příkazu:
  x = 1; 
Operátor přiřazení zde přece také vrátí hodnotu, nebo se mýlím, mistře?
Java guru: Nemýlíš. Návratovou hodnotu operátoru = zde dále nepoužíváme, proto se zahodí. Tento příkaz tedy provede „pouze“ přiřazení hodnoty 1 do proměnné x.
Studentka: Mistře, jaká hodnota je v proměnné, kterou jsme neinicializovali? Co by vytiskl tento kód?
  int x;
  System.out.println( x ); 
Java guru: Tento kód se nepřeloží, protože překladač zjistí, že přistupuješ k neinicializované proměnné. Použití neinicializované proměnné je častou chybou např. v C. V Javě tuto chybu udělat nemůžeš, protože překladač pro každou proměnnou zkontroluje, zda byla inicializována. Některé proměnné jsou inicializovány automaticky (o tom bude dále). Proměnné deklarované v metodě, tzv. lokální proměnné, musíš inicializovat sama. Navíc se kontrola inicializace proměnných provádí i za běhu. Takže i kdybys nějakým způsobem obelstila překladač, běh programu by stejně skončil chybou.