Aritmetické
-
Binární (dvouparametrové) aritmetické operátory:
+ - * / %
(zbytek po celočíselném dělení) -
Operátor dělení
/
je polymorfní-
funguje pro celočíselné argumenty (
byte
,short
,int
along
) jako celočíselný -
pro floating-point (
float
,double
) jako obyčejné dělení.
-
-
Na to je třeba dávat pozor — i když dvě (fakticky i typově) celá čísla nejsou dělitelná, jako podíl se nám vrátí vždy celé číslo (typově i hodnotově).
-
Abychom dosáhli desetinného výsledku, musí být aspoň jeden z operandů typově s pohyblivou řádovou čárkou.
-
Lze zařídit např. typovou konverzí
((double)a)/b
pro celočíselné proměnnéa
,b
.
Logické
-
Pracují nad logickými (booleovskými) hodnotami, samozřejmě vč. výsledků porovnávání
<
,>
,==
, apod.
Logické — součiny
- Logické součiny (AND)
-
-
&
(nepodmíněný, vždy se vyhodnotí oba operandy), -
&&
(podmíněný, líné vyhodnocování (lazy evaluation) — druhý operand se vyhodnotí, jen nelze-li o výsledku rozhodnout z hodnoty prvního)
-
Logické — součty, negace
- Logické součty (OR)
-
-
|
(nepodmíněný, vždy se vyhodnotí oba operandy), -
||
(podmíněný, líné vyhodnocování — druhý operand se vyhodnotí, jen nelze-li o výsledku rozhodnout z hodnoty prvního)
-
- Negace (NOT)
-
-
!
vrátí znegovanou logickou hodnotu argumentu
-
Relační (porovnávací)
- Uspořádání
-
<
,<=
,>=
,>
lze použít na porovnávání primitivních číselných a znakových hodnot - Rovnost
-
==
,!=
test na rovnost/nerovnost lze navíc použít na porovnávání primitivních hodnot i objektů
Porovnávání objektů
-
Pozor na porovnávání objektů.
-
Operátor
==
vracítrue
jen při rovnosti odkazů, tj. jsou-li objekty identické. -
Rovnost obsahu (tedy "rovnocennost") objektů se zjišťuje voláním metody
o1.equals(o2)
. -
equals
se může podívat "dovnitř" objektů, je-li tak napsaná. -
Aby to takto fungovalo, musíme ji my sami u našich vlastních typů překrýt (=sami napsat).
Porovnávání floating-point čísel
-
Pozor na srovnávání floating-point čísel na rovnost.
-
Je třeba počítat s chybami zaokrouhlení.
-
Místo porovnání na přesnou rovnost raději používejme jistou toleranci.
-
abs(expected-actual) < delta
Bitové operace
-
bitový součin
&
-
bitový součet
|
-
bitový exkluzivní součet (XOR) (znak "stříška")
^
-
bitová negace (bitwise-NOT) (znak "tilda")
~
obrátí bity argumentu a výsledek vrátí
Bitové posuny
-
vlevo
<<
o stanovený počet bitů -
vpravo
>>
o stanovený počet bitů s respektováním znaménka -
vpravo
>>>
o stanovený počet bitů bez respektování znaménka
Operátor podmíněného výrazu ? :
-
Jediný ternární operátor v Javě, navíc polymorfní.
-
Pracuje nad různými typy 2. a 3. argumentu.
-
Platí-li první operand (má hodnotu
true
) →-
výsledkem je hodnota druhého operandu
-
jinak je výsledkem hodnota třetího operandu
-
-
Typ prvního operandu musí být
boolean
, typy druhého a třetího musí být přiřaditelné do výsledku.
Operátory typové konverze (přetypování)
-
Podobně jako v C/C++
-
Píše se (typ)hodnota , např.
(Person)o
, kdeo
byla proměnná deklarovaná jakoObject
. -
Pro objektové typy se ve skutečnosti nejedná o žádnou konverzi spojenou se změnou obsahu objektu, nýbrž pouze o potvrzení (běhovou typovou kontrolu), že běhový typ objektu je požadovaného typu — např. (viz výše) že o je typu
Person
. -
Naproti tomu u primitivních typů se jedná o úpravu hodnoty — např.
int
přetypujeme nashort
a ořeže se tím rozsah.
Operátor zřetězení +
-
Plus je rovněž polymorfním operátorem.
-
Chová se jinak pro čísla - sčítá a jinak pro řetězce, kde spojuje.
-
Výsledkem je vždy řetězec, ale argumenty mohou být i jiných typů,
int i = 1; System.out.println("variable i = " + i);
-
Tento kód je v pořádku, s řetězcovou konstantou se spojí řetězcová podoba dalších argumentů (např. čísla).
-
Pokud je argumentem zřetězení odkaz na objekt
o
:-
je-li
o == null
: použije se řetězec"null"
-
je-li
o != null
: použije se hodnota vrácená metodouo.toString()
(tu lze překrýt a dosáhnout tak očekávaného řetězcového výstupu)
-
Priority operátorů a vytváření výrazů
-
Motto: Pravidla priorit operátorů je dobré znát, ale ještě lepší je závorkovat, aby nedošlo k chybám a každý to přesně pochopil!
-
nejvyšší prioritu má násobení, dělení, nejnižší přiřazení
-
nízkou prioritu má ternární operátor
booleovskývýraz ? výraz, když true : výraz, když false
-
rozhodně NEZNEUŽÍVEJME přiřazení ve smyslu, že jej současně použijeme jako výraz, tzn. pracujeme s jeho hodnotu!