"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."
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:”
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."
GO TO FULL VERSION