Logiska operatorer - 1

"Hej, Amigo!"

"Nu ska vi ha en liten lektion om logiska operatorer."

"Vilka logiska operatorer känner du till?"

— ELLER (||), OCH (&&), INTE(!)

"Japp. Bra jobbat. Och kommer du ihåg hur de fungerar?"

"Ja."

"OR ger sant när minst en operand är sann."

"OCH ger sant när båda operanderna är sanna."

"Ändrar INTE sant till falskt, och falskt till sant."

"Det stämmer. Och i vilken ordning utvärderas operatörerna i detta uttryck?"

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

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

"Det här är väldigt enkelt."

"Först, INTE (!), sedan OCH (&&), och sedan ELLER (||) i slutet."

Om vi ​​lade till parenteser skulle vi få:

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

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

"Det stämmer, bra gjort. Och vad är resultatet?"

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

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

3) (!a) == falskt

4) falskt || falskt || falskt == falskt

"Resultatet är falskt."

"Det verkar som om du känner till ämnet perfekt. Sedan ska jag berätta ett par små hemligheter för dig."

"Först utvärderas logiska uttryck från vänster till höger."

"För det andra används kortslutningsutvärdering här (beräkningar utförs endast vid behov). Om slutresultatet redan är känt från utvärdering av en del av uttrycket, utvärderas inte resten av uttrycket."

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

"Detta uttryck är uppdelat i tre delar åtskilda av operatorn OR (||)."

"Om åtminstone en del är sann, så är svaret sant och inget annat behöver beaktas. Följaktligen utvärderas uttrycket så här:"

1)  Utvärdera den första delen:  (true && false) == false

2)  Utvärdera den andra delen:  (sant && sant) == sant

3) Vi utvärderar inte den tredje delen, eftersom det redan är klart att svaret kommer att vara sant .

"Detta tillvägagångssätt kallas också lat utvärdering."

"OK. Och vad är så speciellt med det?"

"Ingenting – tills du börjar anropa metoder inuti uttrycket. Om en del av uttrycket hoppas över kommer metoderna i den överhoppade delen inte att anropas."

"Men det här tillvägagångssättet har blivit väldigt vanligt. Här är anledningen:"

Exempel:
Job job = null;

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

"Om jobbet är null när uttrycket utvärderas, kommer anropet job.isDone() inte att ske!"

"Faktiskt, den första delen av uttrycket är falskt, vilket följs av AND (&&). Så hela uttrycket kommer att vara känt för att vara falskt, och den andra delen kommer inte att vara nödvändig."

"Precis. Det är en bra teknik, eller hur?"

"Japp."