W instrukcji warunkowej języka JavaScript należy sprawdzić, czy wartość zmiennej a leży poza przedziałem domkniętym <0, 100>, a jednocześnie zmienna b jest równa zero. Który zapis warunku jest poprawny?
if ((a < 0 || a > 100) && b == 0)
&& dodaje wymaganie b == 0.if (a < 0 || a > 100 || b != 0)
b != 0, a || przepuszcza wynik po spełnieniu jednego członu.if ((a < 0 && a > 100) || b == 0)
a < 0 && a > 100 nigdy nie jest prawdą, więc liczy się tylko b == 0.if ((a > 0 && a < 100) && b == 0)
Warunek składa się z dwóch części, które muszą być spełnione razem. Pierwsza: a leży poza przedziałem <0, 100>, czyli jest mniejsze od 0 albo większe od 100 - tu potrzebny jest operator ||, bo liczba nie może być jednocześnie mniejsza od 0 i większa od 100. Druga: b == 0. Obie łączy &&, a nawias wokół alternatywy jest konieczny, bo && wiąże silniej niż ||.
Dla a = 150 i b = 0 warunek daje true, a dla a = 50 albo b = 3 - false. Reguła: przedział „pomiędzy” zapisuje się przez &&, „poza przedziałem” przez ||.
Przed zapisaniem warunku warto sprawdzić go na kilku wartościach granicznych.
Problem z tym pytaniem najczęściej wynika z mieszania operatorów logicznych. Zapis (a < 0 && a > 100) nigdy nie jest prawdziwy, bo żadna liczba nie jest jednocześnie ujemna i większa od 100. Cały warunek sprowadza się wtedy do b == 0 i przepuści na przykład a = 50.
Wersja z samymi || i b != 0 ma dwa błędy: sprawdza, czy b jest różne od zera, a do tego wystarcza jej spełnienie dowolnego członu, więc a = 200 przejdzie przy każdym b. Warunek (a > 0 && a < 100) && b == 0 sprawdza przeciwną sytuację - a wewnątrz przedziału, i to bez jego końców.
Poprawny zapis łączy alternatywę (a < 0 || a > 100) z b == 0 operatorem &&.
Przed wyborem warto podstawić do każdego warunku kilka wartości, na przykład 50 i 150, a dla drugiej zmiennej zero i liczbę różną od zera.