Które wyrażenie logiczne należy zastosować w języku JavaScript, aby wykonać operacje tylko dla dowolnych liczb z przedziału jednostronnie domkniętego <1000, 2000)?
A. (liczba >= 1000) || (liczba > 2000)
B. (liczba <= 1000) || (liczba > 2000)
C. (liczba >= 1000) && (liczba < 2000)
D. (liczba <= 1000) && (liczba < 2000)
Wyrażenie (liczba >= 1000) && (liczba < 2000) poprawnie opisuje przedział jednostronnie domknięty <1000, 2000), czyli taki, w którym wartość 1000 należy do zakresu, a 2000 już nie. W JavaScript zapis liczba >= 1000 sprawdza dolną granicę, więc przepuszcza 1000, 1001, 1500 itd. Drugi warunek, liczba < 2000, pilnuje górnej granicy i zatrzymuje 2000 oraz większe wartości. Operator && oznacza logiczne AND, czyli oba warunki muszą być spełnione jednocześnie. To jest bardzo ważne, bo chodzi o liczby znajdujące się pomiędzy granicami, a nie o wartości z zewnątrz. W praktyce taki zapis stosuje się np. przy walidacji formularzy, filtrowaniu cen produktów, sprawdzaniu punktów w systemie oceniania albo ograniczaniu zakresu danych wejściowych. Moim zdaniem to jeden z tych warunków, które warto umieć zapisać automatycznie, bo w kodzie webowym pojawia się ciągle. Dobrą praktyką jest też używanie czytelnych nazw zmiennych, np. cena, rok, punkty, oraz unikanie niepotrzebnie skomplikowanych warunków. JavaScript wykonuje warunki z && od lewej do prawej i stosuje tzw. short-circuit evaluation, więc jeśli pierwszy warunek jest fałszywy, drugi nie musi być już sprawdzany. Tu nie zmienia to wyniku, ale warto wiedzieć, bo przy funkcjach i operacjach na obiektach ma to znaczenie.
W tym zadaniu kluczowe jest zrozumienie, że przedział <1000, 2000) oznacza wartości od 1000 włącznie do 2000 wyłącznie. Inaczej mówiąc, liczba 1000 ma przejść warunek, liczba 1999.99 też, ale 2000 już nie. Jeśli w warunku pojawia się liczba <= 1000, to sprawdzamy coś zupełnie innego: wartości mniejsze lub równe 1000. To obejmuje np. 500 i 1000, ale nie obejmuje 1500, mimo że 1500 powinno być zaakceptowane. Taki błąd często wynika z pomylenia strony znaku nierówności, co w programowaniu zdarza się nawet dość często, szczególnie przy szybkich testach zakresów.
Problemem jest też użycie operatora || tam, gdzie wymagany jest &&. Operator || oznacza logiczne OR, czyli wystarczy spełnienie jednego z warunków. Przy sprawdzaniu, czy liczba leży wewnątrz przedziału, zazwyczaj potrzebujemy obu ograniczeń naraz: dolnej i górnej granicy. Warunek z || może przepuścić wartości spoza zakresu, na przykład bardzo duże liczby, bo spełniają część dotyczącą przekroczenia 2000, albo wartości od 1000 wzwyż bez kontroli górnej granicy. To jest typowy błąd myślowy: ktoś widzi dwa warunki i łączy je alternatywą, bo brzmi to jak dowolny warunek, ale matematycznie chodzi o przecięcie dwóch zbiorów, nie o ich sumę. Z mojego doświadczenia najlepiej czytać taki zapis na głos: liczba ma być większa lub równa 1000 i jednocześnie mniejsza niż 2000. Słowo jednocześnie prawie zawsze podpowiada operator &&.
Problemem jest też użycie operatora || tam, gdzie wymagany jest &&. Operator || oznacza logiczne OR, czyli wystarczy spełnienie jednego z warunków. Przy sprawdzaniu, czy liczba leży wewnątrz przedziału, zazwyczaj potrzebujemy obu ograniczeń naraz: dolnej i górnej granicy. Warunek z || może przepuścić wartości spoza zakresu, na przykład bardzo duże liczby, bo spełniają część dotyczącą przekroczenia 2000, albo wartości od 1000 wzwyż bez kontroli górnej granicy. To jest typowy błąd myślowy: ktoś widzi dwa warunki i łączy je alternatywą, bo brzmi to jak dowolny warunek, ale matematycznie chodzi o przecięcie dwóch zbiorów, nie o ich sumę. Z mojego doświadczenia najlepiej czytać taki zapis na głos: liczba ma być większa lub równa 1000 i jednocześnie mniejsza niż 2000. Słowo jednocześnie prawie zawsze podpowiada operator &&.