Które z wyrażeń logicznych zapisanych w języku C sprawdza, czy zmienna o nazwie zm1 należy do przedziału (6, 203>?
A. (zm1 > 6) || (zm1 <= 203)
B. (zm1 > 6) && (zm1 <= 203)
C. (zm1 > 6) || (zm1 != 203)
D. (zm1 > 6) && (zm1 != 203)
Pytanie z egzaminu CKE, czerwiec 2020 (arkusz EE.09-SG-20.06).
Wyrażenie (zm1 > 6) && (zm1 <= 203) dokładnie sprawdza przynależność zmiennej zm1 do przedziału (6, 203>, czyli do zakresu większego od 6 i jednocześnie mniejszego lub równego 203. Lewy nawias okrągły przy 6 oznacza, że liczba 6 nie należy do przedziału, więc trzeba użyć warunku zm1 > 6. Prawy nawias ostry przy 203 oznacza domknięcie przedziału, więc wartość 203 jest jeszcze dozwolona, stąd zm1 <= 203. Operator && w języku C oznacza logiczne ORAZ, czyli oba warunki muszą być spełnione naraz. To jest bardzo częsty schemat w praktyce, na przykład przy walidacji wieku, zakresu punktów, numeru portu albo wartości wpisanej w formularzu. Moim zdaniem warto zapamiętać prostą zasadę: sprawdzanie, czy liczba jest wewnątrz przedziału, prawie zawsze wymaga połączenia warunków operatorem &&. W dobrym kodzie takie wyrażenie można też zapisać czytelnie w instrukcji if, np. if ((zm1 > 6) && (zm1 <= 203)), bo nawiasy poprawiają czytelność i zmniejszają ryzyko pomyłki przy bardziej złożonych warunkach.
W tym zadaniu kluczowe jest zrozumienie różnicy między operatorem && oraz ||. Przedział (6, 203> oznacza, że zmienna musi spełniać dwa ograniczenia jednocześnie: ma być większa od 6 oraz nie może przekroczyć 203. To nie są warunki alternatywne, tylko warunki graniczne opisujące ten sam zakres wartości. Jeśli użyje się operatora ||, czyli logicznego LUB, wyrażenie staje się zbyt szerokie. Warunek (zm1 > 6) || (zm1 <= 203) będzie prawdziwy prawie dla każdej liczby, bo wystarczy spełnienie jednej strony. Na przykład 300 spełnia zm1 > 6, a 2 spełnia zm1 <= 203, więc oba przykłady przeszłyby test, mimo że nie należą do podanego przedziału. To taki typowy błąd, gdy ktoś czyta zakres jako dwa osobne przypadki, a nie jako przecięcie warunków. Podobny problem pojawia się przy użyciu zm1 != 203. Taki zapis mówi tylko, że zmienna nie jest równa 203, ale nie pilnuje górnej granicy przedziału. Wartość 500 jest różna od 203 i większa od 6, więc przy warunku z && oraz != zostałaby zaakceptowana, chociaż ewidentnie leży poza zakresem. Z mojego doświadczenia najłatwiej to ogarnąć, rysując sobie oś liczbową: wartości mają znaleźć się między 6 a 203, bez 6, ale z 203. W C trzeba więc użyć porównań granicznych i połączyć je operatorem logicznego AND, bo tylko wtedy program sprawdza oba końce przedziału naraz.