Logiske operatorer - 1

"Hej, Amigo!"

"Nu får vi en lille lektion om logiske operatorer."

"Hvilke logiske operatorer kender du?"

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

"Jep. Godt arbejde. Og kan du huske, hvordan de fungerer?"

"Ja."

"OR giver sand, når mindst én operand er sand."

"OG giver sand, når begge operander er sande."

"Ikke ændres fra sand til falsk, og falsk til sand."

"Det er rigtigt. Og i hvilken rækkefølge bliver operatørerne evalueret i dette udtryk?"

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

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

"Det hele er meget simpelt."

"Først IKKE (!), så OG (&&), og derefter ELLER (||) til allersidst."

Hvis vi tilføjede parenteser, ville vi få:

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

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

"Det er alt sammen korrekt, godt gået. Og hvad er resultatet?"

— 1) (a && b) == (sand && falsk) == falsk

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

3) (!a) == falsk

4) falsk || falsk || falsk == falsk

"Resultatet er falsk."

"Det ser ud til, at du kender emnet perfekt. Så vil jeg fortælle dig et par små hemmeligheder."

"Først evalueres logiske udtryk fra venstre mod højre."

"For det andet anvendes kortslutningsevaluering her (beregninger udføres kun hvis det er nødvendigt). Hvis det endelige resultat allerede er kendt fra evaluering af en del af udtrykket, så evalueres resten af ​​udtrykket ikke."

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

"Dette udtryk er opdelt i tre dele adskilt af OR (||) operatoren."

"Hvis mindst én del er sand, så er svaret sandt, og intet andet skal overvejes. Følgelig vurderes udtrykket sådan:"

1)  Evaluer den første del:  (sand && falsk) == falsk

2)  Evaluer den anden del:  (sand && sand) == sand

3) Vi vurderer ikke den tredje del, da det allerede er klart, at svaret vil være sandt .

"Denne tilgang kaldes også doven evaluering."

"OK. Og hvad er så specielt ved det?"

"Intet – indtil du begynder at kalde metoder inde i udtrykket. Hvis en del af udtrykket springes over, vil metoderne i den overspringede del ikke blive kaldt."

"Men denne tilgang er blevet meget almindelig. Her er grunden:"

Eksempel:
Job job = null;

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

"Hvis jobbet er nul, når udtrykket evalueres, vil job.isDone()-kaldet ikke ske!"

"Den første del af udtrykket er faktisk falsk, som efterfølges af OG (&&). Så hele udtrykket vil være kendt for at være falsk, og den anden del vil ikke være nødvendig."

"Nøjagtig. Det er en god teknik, ikke?"

"Ja."