Logiske operatorer - 1

"Hei, Amigo!"

"Nå skal vi ha en liten leksjon om logiske operatører."

"Hvilke logiske operatorer kjenner du?"

— ELLER (||), OG (&&), IKKE(!)

"Jepp. Bra jobbet. Og husker du hvordan de fungerer?"

"Ja."

"OR gir sann når minst én operand er sann."

"AND gir sann når begge operandene er sanne."

"IKKE endres fra sant til usant, og usant til sant."

"Det stemmer. Og i hvilken rekkefølge blir operatørene evaluert i dette uttrykket?"

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

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

"Dette er veldig enkelt."

"Først IKKE (!), deretter OG (&&), og deretter ELLER (||) helt til slutt."

Hvis vi la til parenteser, ville vi fått:

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

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

"Det er helt riktig, godt gjort. Og hva er resultatet?"

— 1) (a && b) == (sant && usant) == usant

2) ((!c) && b) == (falsk && usann) == usann

3) (!a) == usann

4) usann || usant || falsk == falsk

"Resultatet er falskt."

"Det virker som du kjenner emnet perfekt. Da skal jeg fortelle deg et par små hemmeligheter."

"Først blir logiske uttrykk evaluert fra venstre til høyre."

"For det andre brukes kortslutningsevaluering her (beregninger utføres kun hvis nødvendig). Hvis det endelige resultatet allerede er kjent fra evaluering av deler av uttrykket, blir ikke resten av uttrykket evaluert."

Eksempel
boolean result = (true && false) || (true && true) || (true && false);

"Dette uttrykket er delt inn i tre deler atskilt av OR (||)-operatoren."

"Hvis minst én del er sann, så er svaret sant og ingenting annet må vurderes. Følgelig blir uttrykket evaluert slik:"

1)  Vurder den første delen:  (true && false) == usant

2)  Vurder den andre delen:  (true && true) == sant

3) Vi vurderer ikke den tredje delen, siden det allerede er klart at svaret vil være sant .

"Denne tilnærmingen kalles også lat evaluering."

"OK. Og hva er så spesielt med det?"

"Ingenting - før du begynner å kalle metoder inne i uttrykket. Hvis en del av uttrykket hoppes over, vil ikke metodene i den hoppet over bli kalt."

"Men denne tilnærmingen har blitt veldig vanlig. Her er grunnen:"

Eksempel:
Job job = null;

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

"Hvis jobb er null når uttrykket evalueres, vil ikke job.isDone()-kallet skje!"

"Faktisk, den første delen av uttrykket er falsk, som etterfølges av OG (&&). Så hele uttrykket vil være kjent for å være falskt, og den andre delen vil ikke være nødvendig."

"Akkurat. Det er en god teknikk, ikke sant?"

"Japp."