Operatory logiczne - 1

"Cześć, Amigo!"

„Teraz zrobimy małą lekcję na temat operatorów logicznych”.

„Jakie znasz operatory logiczne?”

— LUB (||), ORAZ (&&), NIE(!)

„Tak. Dobra robota. A pamiętasz, jak one działają?”

"Tak."

„OR daje wartość true, gdy przynajmniej jeden operand jest prawdziwy”.

„AND zwraca wartość true, gdy oba operandy są prawdziwe”.

„NIE zmienia prawdy na fałsz, a fałszu na prawdę”.

„Zgadza się. A w jakiej kolejności są obliczane operatory w tym wyrażeniu?”

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

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

„To wszystko jest bardzo proste”.

„Najpierw NIE (!), potem ORAZ (&&), a na samym końcu OR (||)”.

Gdybyśmy dodali nawiasy, otrzymalibyśmy:

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

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

„Wszystko się zgadza, dobra robota. I jaki jest wynik?”

— 1) (a && b) == (prawda && fałsz) == fałsz

2) ((!c) && b) == (fałsz && fałsz) == fałsz

3) (!a) == fałsz

4) fałsz || fałsz || fałsz == fałsz

„Wynik jest fałszywy”.

- Wygląda na to, że doskonale znasz temat. W takim razie zdradzę ci kilka małych sekretów.

„Najpierw wyrażenia logiczne są oceniane od lewej do prawej”.

"Po drugie, stosuje się tutaj ocenę zwarciową (obliczenia są wykonywane tylko w razie potrzeby). Jeśli wynik końcowy jest już znany z oceny części wyrażenia, to reszta wyrażenia nie jest obliczana."

Przykład
boolean result = (true && false) || (true && true) || (true && false);

„To wyrażenie jest podzielone na trzy części oddzielone operatorem OR (||).”

„Jeśli przynajmniej jedna część jest prawdziwa, to odpowiedź jest prawdziwa i nic innego nie musi być brane pod uwagę. W związku z tym wyrażenie jest oceniane w następujący sposób:”

1)  Oceń pierwszą część:  (true && false) == false

2)  Oceń drugą część:  (true && true) == true

3) Nie oceniamy trzeciej części, ponieważ jest już jasne, że odpowiedź będzie prawdziwa .

„To podejście jest również nazywane leniwą oceną”.

„OK. A co jest w tym takiego specjalnego?”

„Nic — dopóki nie zaczniesz wywoływać metod wewnątrz wyrażenia. Jeśli część wyrażenia zostanie pominięta, metody w pominiętej części nie zostaną wywołane”.

„Ale to podejście stało się bardzo powszechne. Oto dlaczego:”

Przykład:
Job job = null;

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

„Jeśli zadanie ma wartość NULL podczas obliczania wyrażenia, wywołanie zadania.isDone() nie nastąpi!”

„Rzeczywiście, pierwsza część wyrażenia jest fałszywa, po której następuje AND (&&). Tak więc całe wyrażenie będzie fałszywe, a druga część nie będzie potrzebna”.

„Dokładnie. To dobra technika, prawda?”

"Tak."