Operatori logici - 1

"Bună, Amigo!"

„Acum vom avea o mică lecție despre operatorii logici”.

„Ce operatori logici cunoașteți?”

— SAU (||), ȘI (&&), NU(!)

"Da. Bună treabă. Și îți amintești cum funcționează?"

"Da."

„OR este adevărat când cel puțin un operand este adevărat”.

„ȘI este adevărat când ambii operanzi sunt adevărati”.

„NU se schimbă adevărat în fals și fals în adevărat”.

"Așa este. Și în ce ordine sunt evaluați operatorii în această expresie?"

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

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

"Totul acesta este foarte simplu."

„Mai întâi, NU (!), apoi ȘI (&&) și apoi SAU (||) la sfârșit.”

Dacă am adăuga paranteze, atunci am obține:

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

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

"Asta e corect, bine făcut. Și care este rezultatul?"

— 1) (a && b) == (adevărat && fals) == fals

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

3) (!a) == fals

4) fals || fals || false == false

„Rezultatul este fals”.

"Se pare că știi perfect subiectul. Apoi îți voi spune câteva secrete."

„În primul rând, expresiile logice sunt evaluate de la stânga la dreapta.”

"În al doilea rând, evaluarea de scurtcircuit este utilizată aici (calculele sunt efectuate numai dacă este necesar). Dacă rezultatul final este deja cunoscut din evaluarea unei părți a expresiei, atunci restul expresiei nu este evaluat."

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

„Această expresie este împărțită în trei părți separate de operatorul SAU (||)”.

„Dacă cel puțin o parte este adevărată, atunci răspunsul este adevărat și nimic altceva nu trebuie luat în considerare. În consecință, expresia este evaluată astfel:”

1)  Evaluați prima parte:  (adevărat && fals) == fals

2)  Evaluați a doua parte:  (adevărat && adevărat) == adevărat

3) Nu evaluăm partea a treia, deoarece este deja clar că răspunsul va fi adevărat .

„Această abordare se mai numește și evaluare leneșă”.

"OK. Și ce este atât de special la asta?"

„Nimic – până când nu începeți să apelați metode din interiorul expresiei. Dacă o parte a expresiei este omisă, atunci metodele din partea omisă nu vor fi apelate.”

„Dar această abordare a devenit foarte comună. Iată de ce:”

Exemplu:
Job job = null;

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

„Dacă jobul este nul când expresia este evaluată, atunci apelul job.isDone() nu se va întâmpla!”

„Într-adevăr, prima parte a expresiei este falsă, care este urmată de AND (&&). Deci, întreaga expresie va fi cunoscută ca fiind falsă, iar a doua parte nu va fi necesară.”

— Exact. Este o tehnică bună, nu?

"Da."