Obsah

Logické operátory

logický člen AND

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. logický součin 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é" );
  } 

logický člen OR

logický součet 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:
  boolean b1 = (x > 0) && (y == 1);
  boolean b2 = (x <= 0) || (y <= 0); 
Je možné vytvářet i složitější výrazy:
  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: logický xor 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.