Logikai operátorok – 1

– Szia Amigo!

– Most lesz egy kis leckénk a logikai operátorokról.

– Milyen logikai operátorokat ismer?

— VAGY (||), ÉS (&&), NEM(!)

"Igen. Jó munka. És emlékszel, hogyan dolgoznak?"

"Igen."

"VAGY akkor ad igazat, ha legalább egy operandus igaz."

"ÉS akkor igaz, ha mindkét operandus igaz."

"NEM változik igazról hamisra, és hamisról igazra."

"Úgy van. És milyen sorrendben vannak kiértékelve az operátorok ebben a kifejezésben?"

boolean a = true;
boolean b = false;
boolean c = true;

boolean result = a && b || !c && b || !a;

– Ez az egész nagyon egyszerű.

"Először NEM (!), majd ÉS (&&), majd VAGY (||) a legvégén."

Ha zárójeleket adunk hozzá, akkor a következőket kapjuk:

boolean a = true;
boolean b = false;
boolean c = true;

boolean result = (a && b) || ((!c) && b) || (!a);

"Ez mind helyes, jól sikerült. És mi az eredmény?"

— 1) (a && b) == (igaz && hamis) == hamis

2) ((!c) && b) == (hamis && false) == hamis

3) (!a) == hamis

4) hamis || hamis || hamis == hamis

– Az eredmény hamis.

"Úgy tűnik, tökéletesen ismeri a témát. Akkor elárulok pár apró titkot."

"Először is a logikai kifejezéseket balról jobbra értékelik."

"Itt a második, rövidzárlati kiértékelést használjuk (a számításokat csak szükség esetén végezzük). Ha a kifejezés egy részének kiértékeléséből már ismert a végeredmény, akkor a kifejezés többi része nem kerül kiértékelésre."

Példa
boolean result = (true && false) || (true && true) || (true && false);

"Ez a kifejezés három részre van osztva, amelyeket az OR (||) operátor választ el."

"Ha legalább egy rész igaz, akkor a válasz igaz, és semmi mást nem kell figyelembe venni. Ennek megfelelően a kifejezés a következőképpen kerül kiértékelésre:"

1)  Értékelje az első részt:  (igaz és hamis) == hamis

2)  Értékelje a második részt:  (igaz && igaz) == igaz

3) A harmadik részt nem értékeljük, mivel már most világos, hogy a válasz igaz lesz .

"Ezt a megközelítést lusta értékelésnek is nevezik."

"Rendben. És mi olyan különleges benne?"

"Semmi – amíg el nem kezdi a metódusok meghívását a kifejezésen belül. Ha a kifejezés egy része kimarad, akkor a kihagyott részben lévő metódusok nem lesznek meghívva."

"De ez a megközelítés nagyon elterjedt. Ennek oka:"

Példa:
Job job = null;

if (job != null && job.isDone())
{
…
}

"Ha a job nulla a kifejezés kiértékelésekor, akkor a job.isDone() hívás nem fog megtörténni!"

"Valóban, a kifejezés első része hamis, amit AND (&&) követ. Tehát a teljes kifejezésről tudni fogjuk, hogy hamis, és a második részre nem lesz szükség."

– Pontosan. Ez egy jó technika, igaz?

"Igen."