"Hallo Amigo!"
"Nu krijgen we een kleine les over logische operatoren."
"Welke logische operatoren ken je?"
— OF (||), EN (&&), NIET(!)
"Ja. Goed gedaan. En weet je nog hoe ze werken?"
"Ja."
"OF levert waar op als ten minste één operand waar is."
"AND levert waar op als beide operanden waar zijn."
"NIET verandert waar in onwaar en onwaar in waar."
"Dat klopt. En in welke volgorde worden de operatoren geëvalueerd in deze uitdrukking?"
boolean a = true;
boolean b = false;
boolean c = true;
boolean result = a && b || !c && b || !a;
"Dit is allemaal heel eenvoudig."
"Eerst, NIET (!), dan AND (&&), en dan OR (||) helemaal aan het einde."
Als we haakjes zouden toevoegen, zouden we krijgen:
boolean a = true;
boolean b = false;
boolean c = true;
boolean result = (a && b) || ((!c) && b) || (!a);
"Dat klopt allemaal, goed gedaan. En wat is het resultaat?"
— 1) (a && b) == (waar && onwaar) == onwaar
2) ((!c) && b) == (onwaar && onwaar) == onwaar
3) (!a) == onwaar
4) onwaar || vals || onwaar == onwaar
"Het resultaat is vals."
'Het lijkt erop dat je het onderwerp perfect kent. Dan zal ik je een paar kleine geheimen vertellen.'
"Eerst worden logische uitdrukkingen van links naar rechts geëvalueerd."
"Ten tweede wordt hier kortsluitevaluatie gebruikt (berekeningen worden alleen indien nodig uitgevoerd). Als het eindresultaat al bekend is door een deel van de uitdrukking te evalueren, wordt de rest van de uitdrukking niet geëvalueerd."
boolean result = (true && false) || (true && true) || (true && false);
"Deze uitdrukking is opgedeeld in drie delen gescheiden door de operator OR (||)."
"Als ten minste één deel waar is, dan is het antwoord waar en hoeft verder niets te worden overwogen. Dienovereenkomstig wordt de uitdrukking als volgt geëvalueerd:"
1) Evalueer het eerste deel: (true && false) == false
2) Evalueer het tweede deel: (waar && waar) == waar
3) We evalueren het derde deel niet, aangezien het al duidelijk is dat het antwoord waar zal zijn .
"Deze aanpak wordt ook wel luie evaluatie genoemd."
"Oké. En wat is er zo speciaal aan?"
"Niets—totdat je methoden binnen de uitdrukking begint aan te roepen. Als een deel van de uitdrukking wordt overgeslagen, worden de methoden in het overgeslagen deel niet aangeroepen."
"Maar deze aanpak is heel gewoon geworden. Dit is waarom:"
Job job = null;
if (job != null && job.isDone())
{
…
}
"Als job null is wanneer de expressie wordt geëvalueerd, zal de aanroep job.isDone() niet plaatsvinden!"
"Inderdaad, het eerste deel van de uitdrukking is onwaar, gevolgd door AND (&&). Dus de hele uitdrukking zal bekend staan als onwaar en het tweede deel is niet nodig."
'Precies. Het is een goede techniek, toch?'
"Ja."
GO TO FULL VERSION