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.
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.
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).
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.
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.
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.
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.