Spis treści
- Rozdział 4 - Instrukcje warunkowe
- Podstawy instrukcji warunkowych
- Operatory relacyjne
- Typ boolean
- Warunki instrukcji if
- Operatory warunkowe i operator logiczny !
- Tablica prawdy operatorów warunkowych
- Nawiasy i priorytety operatorów warunkowych
- Short-circuit evaluation
- Zagnieżdżanie instrukcji warunkowych
- Bloki kodu i zakresy zmiennych
- Instrukcja switch
- Trój-argumentowy operator logiczny
- Podsumowanie
- Pytania
- Zadania
Pisząc złożone instrukcje warunkowe, często jesteśmy w stanie odpowiedzieć na pytanie, czy całe wyrażenie ma szansę być prawdą bądź nie jeszcze zanim obliczymy każde z wyrażeń, które na ten warunek się składa – spójrzmy na poniższy fragment kodu:
if (a <= 0 || b <= 0) { System.out.println("Nieprawidlowe dane."); } else { System.out.println("Pole wynosi " + a * b); }
W powyższej instrukcji warunkowej sprawdzamy poprawność wartości boków prostokąta, przechowywanych w zmiennych a oraz b. Zauważmy, że wystarczy, że pierwsze wyrażenie, a <= 0, będzie prawdą, aby całe wyrażenie:
a <= 0 || b <= 0
miało wartość true. W takim przypadku, obliczanie wartości wyrażenia b <= 0 nie ma sensu, bo i tak wiemy już, że niezależnie od wartości wyrażenia b <= 0, całe wyrażenie, a <= 0 || b <= 0 będzie miało wartość true (ponieważ operatorowi || wystarczy jeden argument o wartości true, aby całe wyrażenie miało wartość true).
Wartość wyrażenia b <= 0 musiałaby być wyznaczona tylko w przypadku, gdy wartość wyrażenia a <= 0 miałaby wartość false – ponieważ jest jeszcze szansa, że całe wyrażenie a <= || b <= 0 będzie miało wartość true, jeżeli b <= 0 będzie miało wartość true.
Podobnie sprawa ma się z operatorem && – zapiszmy powyższy fragment kodu z użyciem tego operatora:
if (a > 0 && b > 0) { System.out.println("Pole wynosi " + a * b); } else { System.out.println("Nieprawidlowe dane."); }
Jeżeli okaże się, że wartość a > 0 to false, to nie ma sensu sprawdzać wartości wyrażenia b > 0 – całe wyrażenie a > 0 && b > 0 nie ma szansy mieć wartości true, jeżeli chociaż jeden z jego członów ma wartość false (operator && zwróci true tylko, gdy oba operatory będą miały wartość true).
Jeżeli wartością a > 0 byłoby true, to musimy jeszcze sprawdzić drugą wartość: b > 0 – ponieważ, po obliczeniu pierwszego wyrażenia a > 0 nadal nie jesteśmy pewni, czy całe wyrażenie a > 0 && b > 0 będzie miało wartość true czy false – aby odpowiedzieć na to pytanie, potrzebujemy wartości wyrażenia b > 0.
Wyobraźmy sobie teraz, że mamy złożoną instrukcję warunkową, składającą się z wielu wyrażeń, których obliczenie jest kosztowane z punktu widzenia działania komputera, bądź kolejne warunki w wyrażeniu są zależne od poprzednich.
Dzięki funkcjonalności zwanej short-circuit evaluation, nasz program nie będzie zawsze sprawdzał wszystkich warunków, jeżeli jest w stanie wcześniej jednoznacznie wyznaczyć końcową wartość danego wyrażenia. Nie musimy nic robić, aby z tej funkcjonalności korzystać – jest ona po prostu automatycznie stosowana przez Maszynę Wirtualną Java, która wykonuje kod naszego programu.
Na razie short-circuit evaluation nie będzie miało dla nas dużego znaczenia, ale zobaczymy, że jest to istotna funkcjonalność, gdy zaczniemy korzystać z metod oraz klas.