8. V²razy
V²raz se sklßdß z operand∙ a operßtor∙. Operandem m∙╛e b²t konstanta,
prom∞nnß, volßnφ metody nebo op∞t v²raz. Operßtory udßvajφ, co se mß provΘst
s jednotliv²mi hodnotami operand∙.
8.1. AritmetickΘ operßtory
V╣echny aritmetickΘ operßtory lze pou╛φt pro prßci s celoΦφseln²mi
i racionßlnφmi hodnotami. V nßsledujφcφ tabulce je uveden seznam
binßrnφch aritmetick²ch operßtor∙ a jejich pou╛itφ.
Oper. | Pou╛itφ | Popis |
+ | op1 + op2 | souΦet operand∙ op1 a op2 |
- | op1 - op2 | rozdφl operand∙ op1 a op2 |
* | op1 * op2 | souΦin operand∙ op1 a op2 |
/ | op1 / op2 | podφl operand∙ op1 a op2 |
% | op1 % op2 | zbytek po d∞lenφ op1 operandem op2 |
|
Dßle jsou k dispozici tyto unßrnφ aritmetickΘ operßtory:
Oper. | Pou╛itφ | Popis |
+ | +op | indikace kladnΘ hodnoty |
- | -op | aritmetickß negace operandu |
++ | op++ | inkrementace op o 1 po jeho vyhodnocenφ |
++ | ++op | inkrementace op o 1 p°ed jeho vyhodnocenφm |
--
|
op--
| dekrementace op o 1 po jeho vyhodnocenφ |
--
|
--op
| dekrementace op o 1 p°ed jeho vyhodnocenφm |
|
8.2. RelaΦnφ operßtory
RelaΦnφ operßtory porovnßvajφ dva v²razy ekvivalentnφch typ∙ a
rozhodnou o platnosti vztahu mezi nimi. V²sledkem relaΦnφho operßtoru je v╛dy
hodnota false nebo true .
Oper. | Pou╛itφ | V²sledek je true jestli╛e |
> | op1 > op2 | op1 je v∞t╣φ ne╛ op2 |
>= | op1 >= op2 | op1 je v∞t╣φ ne╛ nebo roven op2 |
< | op1 < op2 | op1 je men╣φ ne╛ op2 |
<= | op1 <= op2 | op1 je men╣φ ne╛ nebo roven op2 |
== | op1 == op2 | op1 a op2 jsou si rovnΘ |
!= | op1 != op2 | op1 a op2 si nejsou rovnΘ |
|
Mezi relaΦnφ operßtory dßle pat°φ operßtor instanceof , kter² porovnßvß,
zda objekt je instancφ danΘ t°φdy nebo rozhranφ. Jeho syntaxe je:
objekt instanceof JmΘnoT°φdyNeboRozhranφ
Priklad 8.1. |
String retezec = "ahoj";
if (retezec instanceof String) // test na t°φdu
System.out.println("Je to String!");
if (retezec instanceof Runnable) // test na rozhranφ
System.out.println("Implementuje Runnable!");
|
|
8.3. LogickΘ operßtory
Pro kombinaci relaΦnφch operßtor∙ je nutnΘ pou╛φt logickΘ operßtory. Nap°φklad
v²raz op1 < op2 < op3 je t°eba zapsat jako logickou kombinaci dvou
relaΦnφch operßtor∙ (op1 < op2) && (op2 < op3) . Java obsahuje tyto
logickΘ operßtory:
Oper. | Pou╛itφ | V²sledek je true jestli╛e: |
&& | op1 && op2 | op1 a op2 nab²vajφ hodnotu true |
|| | op1 || op2 | alespo≥ jeden z op je true |
! | !op | op nab²vß hodnotu false (negace) |
|
8.4. BitovΘ operßtory
BitovΘ operßtory umo╛≥ujφ manipulaci s jednotliv²mi bity celoΦφseln²ch
datov²ch typ∙.
Oper. | Pou╛itφ | Operace |
>> | op1 >> op2 | bitov² posuv op1 doprava o op2 bit∙ |
<< | op1 << op2 | bitov² posuv op1 doleva o op2 bit∙ |
>>> | op1 >>>op2 | jako >>, ale neznamΘnkov∞ |
& | op1 & op2 | bitov² AND |
| | op1 | op2 | bitov² OR |
^ | op1 ^ op2 | bitov² XOR |
˜ | ˜op | bitov² dopln∞k |
|
8.5. Operßtor p°i°azenφ
Pro operßtor p°i°azenφ se pou╛φvß znak "= ". Tento operßtor lze
pou╛φt i pro inicializaci prom∞nn²ch p°i deklaraci lokßlnφ prom∞nnΘ (viz
9.4.).
Priklad 8.2. |
int slon = 2;
int chobot = 1;
String text1 = "Tri sloni maji tri choboty";
String text2;
chobot = slon = 3;
text2 = text1;
|
|
P°i p°i°azenφ hodnoty do referenΦnφ prom∞nnΘ se objekt nebo pole
nekopφruje (1) , ale p°i°adφ se pouze reference.
Vlastnφ objekt nebo pole z∙stßvß v pam∞ti pouze v jednom exemplß°i.
ReferenΦnφ prom∞nnΘ lze p°i°adit neplatnou referenci null.
Pro p°i°azenφ lze pou╛φt n∞kter²ch zkrßcen²ch tvar∙:
Oper. | Pou╛itφ | Ekvivalent |
+= | op1 += op2 | op1 = op1 + op2 |
-= | op1 -= op2 | op1 = op1 - op2 |
*= | op1 *= op2 | op1 = op1 * op2 |
/= | op1 /= op2 | op1 = op1 / op2 |
%= | op1 %= op2 | op1 = op1 % op2 |
&= | op1 &= op2 | op1 = op1 & op2 |
|= | op1 |= op2 | op1 = op1 | op2 |
^= | op1 ^= op2 | op1 = op1 ^ op2 |
<<= | op1 <<= op2 | op1 = op1 << op2 |
>>= | op1 >>= op2 | op1 = op1 >> op2 |
>>>= | op1 >>>= op2 | op1 = op1 >>> op2 |
|
8.6. Operßtor konverze (p°etypovßnφ)
Konverze datov²ch typ∙ lze se rozd∞lit zhruba na tyto okruhy:
- identickΘ konverze - konverze na tent²╛ typ (nep°etypovßvß se),
- roz╣i°ujφcφ konverze - provßd∞jφ se implicitn∞ a nenφ nutnΘ uvßd∞t
operßtor p°etypovßnφ,
- zu╛ujφcφ konverze - p°i nich m∙╛e dojφt ke ztrßt∞ informace a musφ se
provßd∞t operßtorem p°etypovßnφ - jeho syntaxe je:
( typ ) operand
- konverze zßkladnφch datov²ch typ∙ na °et∞zec a opaΦn∞ - viz
14.3.,
- zakßzanΘ konverze - konverze, kterΘ obvykle nemajφ smysl (nap°φklad
konverze reference na double) a p°etypovßnφ na void.
U p°φkazu p°i°azenφ p°ekladaΦ automaticky provßdφ zu╛ujφcφ konverze na typy
byte, short a char, pokud je na pravΘ stran∞ v²sledek v²razu
typu int a zßrove≥ je v²sledek v oboru hodnot t∞chto typ∙.
8.6.1. Roz╣i°ujφcφ konverze
P°i provßd∞nφ roz╣i°ujφcφ datovΘ konverze nedochßzφ ke ztrßt∞
informace. (2) Jednß
se o konverze, kde v²sledn² datov² typ mß v∞t╣φ obor hodnot ne╛ typ p∙vodnφ.
P°i t∞chto konverzφch nedojde k chyb∞ za b∞hu programu. Zde je p°ehled
roz╣i°ujφcφch konverzφ pro zßkladnφ datovΘ typy:
- byte ---> short, int, long,
float, double,
- char, short ---> int, long, float, double,
- int ---> long, float, double,
- long ---> float, double,
- float ---> double.
Priklad 8.3. |
int big = 1234567890;
float approx = big; // ztrßta informace
System.out.println(big - (int)approx); // vypφ╣e Φφslo: -46
|
|
Mezi roz╣i°ujφcφ konverze pro referenΦnφ datovΘ typy pat°φ:
- t°φda S ---> t°φda T, kde S je potomek t°φdy
T,
- t°φda S ---> rozhranφ K, kde S implementuje
rozhranφ K,
- rozhranφ J ---> rozhranφ K, kde J je potomkem
rozhranφ K,
- libovolnΘ rozhranφ nebo pole ---> t°φda Object (viz
11.5.),
- libovolnΘ pole ---> rozhranφ Cloneable(viz
11.5.),
- pole a[] ---> pole b[], kde a a b jsou
pole referenΦnφch datov²ch typ∙ a konverze a ---> b je
roz╣i°ujφcφ.
V²sledkem roz╣i°ujφcφ konverze referenΦnφch typ∙ je pouze reference.
Neprovßdφ se ╛ßdnß specißlnφ akce s objektem nebo polem.
Kontrola sprßvnosti konverze se provßdφ ji╛ p°i p°ekladu a nem∙╛e
vyvolat v²jimku ClassCastException.
Priklad 8.4. |
Object x;
Double cislo = "Ahoj!";
x = text;
|
|
8.6.2. Zu╛ujφcφ konverze
P°i provßd∞nφ zu╛ujφcφ konverze m∙╛e dojφt ke ztrßt∞ hodnoty a p°esnosti. Zde
je jejich p°ehled pro zßkladnφ datovΘ typy:
- short ---> byte,
- short ---> byte, char,
- char ---> byte, short,
- int ---> byte, short, char
- long ---> byte, short, char, int
- float ---> byte, short, char,
int, long,
- double ---> byte, short, char,
int, long, float.
Zu╛ujφcφ konverze mezi celoΦφseln²mi datov²mi typy se provede o°φznutφm
vßhov∞ vy╣╣φch bit∙. P°i konverzi z typu float nebo double na
celoΦφseln² datov² typ se provede nejd°φve konverze na typ long
(pop°φpad∞ na int - p°i konverzi na int, short, char
nebo byte), a pak na cφlov² datov² typ.
Priklad 8.5. |
System.out.println("255: " + (byte) 255); // Vypφ╣e Φφslo: -1
|
|
Mezi zu╛ujφcφ konverze pro referenΦnφ datovΘ typy pat°φ:
- t°φda S ---> t°φda T, kde S je rodiΦem t°φdy
T,
- t°φda S ---> rozhranφ K, kde S nenφ koncovß
(final) a neimplementuje rozhranφ K,
- rozhranφ J ---> K, kde J je potomkem rozhranφ
K,
- t°φda Object ---> libovolnΘ rozhranφ,
- t°φda Object ---> libovolnΘ pole,
- rozhranφ J ---> T, kde T nenφ koncovΘ,
- rozhranφ J ---> t°φda T, kde T je koncovß
a implementuje J,
- rozhranφ J ---> rozhranφ K, kde J
neimplementuje K a neexistuje metoda, kterou by obsahovala ob∞ rozhranφ
a kterß by zßrove≥ m∞la r∙zn² nßvratov² typ,
- pole a[] ---> pole b[], kde a a b jsou
pole referenΦnφch datov²ch typ∙ a konverze a ---> b je
zu╛ujφcφ.
P°i konverzi m∙╛e b²t vyvolßna vyjφmka ClassCastException.
8.7. Ternßrnφ operßtor
Ternßrnφ operßtor je jakousi obdobou p°φkazu if. Jeho syntaxe je:
v²raz1 ? v²raz2 : v²raz3
Pokud v²raz1 nab²vß hodnoty true , vyhodnotφ se
v²raz2, v opaΦnΘm p°φpad∞ se vyhodnotφ v²raz3.
Priklad 8.6. |
b != 0 ? c = a / b : c = 0; // pokud b je nenulovΘ, provede se d∞lenφ
// jinak se do c p°i°adφ 0
|
|
8.8. Operßtor new
Operßtor new slou╛φ k vytvo°enφ objektu - syntaxe viz
11.1.1., 11.8..
8.9. P°ehled priorit jednotliv²ch operßtor∙
Pokud zapsan² v²raz obsahuje vφce operßtor∙, je vyhodnocovßnφ dßno jejich
prioritou. D°φve se vyhodnocujφ operßtory s vy╣╣φ prioritou (ty s ni╛╣φm
Φφslem). Operßtory se stejnou prioritou se vyhodnocujφ zleva doprava. Pro
zm∞nu po°adφ vyhodnocovßnφ lze pou╛φt kulatΘ zßvorky.
P | Typ operßtor∙ | Operßtory |
1 | postfixovΘ | [] . (parametry) op++
op- |
2 | unßrnφ operßtory | ++op -op +op
-op ˜ ! |
3 | vytvß°enφ a p°etyp. | new (typ) v²raz |
4 | multiplikativnφ | * / % |
5 | aditivnφ | + - |
6 | posuvy | << >> >>> |
7 | relace | < > <= >= instanceof |
8 | ekvivalence | == != |
9 | bitovΘ AND | & |
10 | bitovΘ XOR | ^ |
11 | bitovΘ OR | | |
12 | logickΘ AND | && |
13 | logickΘ OR | || |
14 | ternßrnφ | ? : |
15 | p°i°azenφ | = += -= *= /= %= ^= &= |
| | |= <<= >>= >>>= |
|
Priklad 8.7. |
x = -(4 * (c + 2)); // zm∞na po°adφ vyhodnocovßnφ
|
|
|