Dione
Z. KotalaP. Toman: Java
Predchozi (Obsah) Dalsi

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φ


  • (1) Pro kopφrovßnφ objekt∙ a polφ, lze pou╛φt metodu clone(), viz 11.5.
  • (2) V²jimku tvo°φ konverze int, long ---> float a long ---> double, kdy celΘ Φφslo nemusφ mφt obraz v prostoru Φφsel s pohyblivou °ßdovou Φßrkou. V²sledek konverze je pak nejbli╛╣φ mo╛nΘ Φφslo podle normy IEEE 754.

Predchozi
Converted by Selathco v0.9 on 25.09.1999 19:46
Dalsi