Które z wyrażeń logicznych zapisanych w języku C sprawdza, czy zmienna o nazwie zm1 należy do przedziału (6, 203]?
Wyrażenie (zm1 > 6) && (zm1 <= 203) dokładnie opisuje przedział (6, 203]. Nawias okrągły przy 6 oznacza, że wartość 6 nie należy do przedziału, więc w C trzeba użyć operatora >, a nie >=. Nawias kwadratowy przy 203 oznacza, że 203 jest jeszcze dozwolone, dlatego używamy <=. Operator && oznacza logiczne „i”, czyli oba warunki muszą być spełnione jednocześnie: zmienna ma być większa od 6 oraz nie większa niż 203. Moim zdaniem to jeden z tych zapisów, które warto od razu kojarzyć z kontrolą zakresu danych, np. przy sprawdzaniu wieku, liczby punktów, rozmiaru pliku albo wartości wpisanej w formularzu. W języku C operatory porównania zwracają wartość logiczną w praktyce reprezentowaną jako 0 albo 1, a && dodatkowo działa z tzw. krótkim spięciem, czyli drugi warunek nie musi być sprawdzany, jeśli pierwszy jest fałszywy. Dobrą praktyką jest testowanie wartości granicznych: dla zm1 = 6 wynik ma być fałszem, dla 7 prawdą, dla 203 prawdą, a dla 204 fałszem. Taki sposób myślenia bardzo pomaga przy pisaniu warunków w instrukcjach if.
W tym zadaniu najważniejsze jest rozumienie, że przedział (6, 203] wymaga spełnienia dwóch ograniczeń naraz. Zmienna musi być większa od 6 i jednocześnie mniejsza lub równa 203. Częsty błąd polega na użyciu operatora ||, czyli logicznego „lub”, tam gdzie potrzebne jest &&. W C operator || oznacza, że wystarczy spełnienie jednego z warunków, więc zapis z „zm1 > 6 lub zm1 <= 203” w praktyce przepuszcza prawie wszystko, a dla zwykłych liczb nawet wszystkie wartości: liczby małe spełniają warunek <= 203, a liczby duże spełniają warunek > 6. To nie jest sprawdzanie zakresu, tylko zbyt szeroka alternatywa. Inną pułapką jest mylenie końca przedziału domkniętego z operatorem !=. Warunek zm1 != 203 mówi tylko, że zmienna nie może być równa 203, ale nie ogranicza jej od góry. Przez to wartość 300 mogłaby przejść, mimo że nie należy do podanego przedziału, a sama wartość 203 zostałaby odrzucona, chociaż powinna być zaakceptowana. Jeszcze bardziej mylące jest połączenie || z !=, bo taki warunek staje się logicznie prawdziwy dla właściwie każdej zwykłej wartości liczbowej. Z mojego doświadczenia najlepiej tłumaczyć sobie to tak: jeśli sprawdzamy, czy liczba jest „pomiędzy”, to prawie zawsze potrzebujemy &&, bo liczba ma być po obu stronach ograniczona jednocześnie. Operator || przydaje się raczej wtedy, gdy dopuszczamy kilka osobnych przypadków, np. wartość jest mniejsza od 0 albo większa od 100.