Z výrazů typu boolean můžeme vytvářet složitější výrazy pomocí
logických operátorů. Logický operátor
má operandy typu
boolean a vrací hodnotu typu
boolean.
Podmínkový operátor logického
součinu se zapisuje && a vrací
true tehdy a jen tehdy, pokud mají oba
jeho operandy hodnotu true. Pomocí tohoto
operátoru můžeme dvojici příkazů if
if( x >= 0 ) {
if( y >= 0 ) {
System.out.println( "x a y jsou nezáporné" );
}
}
zapsat jednodušeji takto:
if( x >= 0 && y >= 0 ) {
System.out.println( "x a y jsou nezáporné" );
}
Podmínkový operátor logického součtu se zapisuje
|| a vrací true
tehdy a jen tehdy, pokud alespoň jeden jeho operand má hodnotu
true.
if( x == 0 || y == 0 ) {
System.out.println( "alespoň jedno z čísel x, y je rovno 0" );
}
Oba tyto operátory používají tzv.
zkrácené vyhodnocování, tj. druhý
operand se vyhodnotí pouze v případě, že po vyhodnocení prvního
operandu není známa hodnota celého výrazu. Např. má-li v logickém
součinu první operand hodnotu false,
druhý operand se nevyhodnocuje a hodnota celého výrazu je
false. Protože se tyto operátory
používají často v podmínkách, říká se jim podmínkové.
Kromě podmínkových operátorů má Java také operátory, které
vyhodnocují vždy oba operandy. Zapisují se
& (logický součin)
a | (logický součet). Lze je použít
na stejném místě jako podmínkové operátory:
boolean b1 = x > 0 & y == 1;
boolean b2 = x <= 0 | y <= 0;
Logické operátory mají nižší prioritu než relační, takže se obvykle
obejdeme bez závorek. Závorky však někdy mohou přispět ke zlepšení
čitelnosti:
if( x == 0 && y == 0 && z == 0 ) {
System.out.println( "x, y, z mají hodnotu 0" );
}
Kombinujeme-li logický součin s logickým součtem, je potřeba mít
na paměti, že logický součin má vyšší prioritu než logický součet:
if( x == 0 || y > 0 && z > 0 ) {
System.out.println( "x je nula nebo jsou y a z kladná" );
}
Vyhodnocení druhého operandu může mít vedlejší efekt. Pak nelze
operátory s úplným a zkráceným vyhodnocováním zaměňovat.
int x = sc.nextInt(), y = 0;
if( x == 0 && y++ > 0 ) {
System.out.println( "x je nula a y je kladné" );
}
Zde při vyhodnocení druhého operandu logického součinu dojde ke
zvýšení hodnoty y o 1. K tomu ovšem dojde
pouze tehdy, když je hodnota prvního operandu
true, protože jsme použili podmínkový
operátor &&. Při použití
operátoru & by se hodnota
y zvýšila vždy, bez ohledu na hodnotu
prvního operandu.
Úloha 1
Doplňte podmínku.
Úloha 2
Doplňte podmínku.
Úloha 3
Určete, co se vytiskne, jestliže zadáme na vstupu hodnoty 0 a 1.
Úloha 4
Doplňte příkazy a výrazy.
Úloha 5
Doplňte věty.
Otázky a odpovědi
Studentka:
Mistře, existují v Javě i jiné logické operátory?
Java guru:
Ano. Kromě logického součinu a logického součtu má Java ještě
exkluzivní logický součet (nonekvivalenci), který se zapisuje
pomocí ^. Vrací hodnotu
true právě tehdy, pokud právě jeden
jeho operand má hodnotu true.
boolean b = (x > 10) ^ (y < -10);
Jeho priorita je nižší než priorita logického součinu
(&) a vyšší než priorita
logického součtu (|). Na rozdíl od
logického součinu a logického součtu je u exkluzivního
logického součtu vždy nutné vyhodnotit oba operandy. Proto je
zaveden pouze jeden operátor exkluzivního logického součtu.
Studentka:
Mistře, jaké operátory mám použít v případě, že vyhodnocení
logického výrazu nemá vedlejší efekt? Mám dát přednost
podmínkovým operátorům se zkráceným vyhodnocováním nebo
operátorům s úplným vyhodnocováním?
Java guru:
Pokud nezáleží na tom, zda dojde či nedojde k vyhodnocení obou
operandů, používej podmínkové operátory. Vyhodnocují se
efektivněji než operátory s úplným vyhodnocováním.
boolean b = (x > 0) && (y > 0); // && je zde mírně lepší než &
Používáš-li překladač firmy Oracle, bude bajtkód, který
vznikne překladem tohoto výrazu, většinou kratší než při
použití operátoru s úplným vyhodnocováním.