KWALIFIKACJA INF3 - STYCZEŃ 2017

PYTANIE NR 40.
W ramce przedstawiono kod JavaScript z błędem logicznym. Program powinien wypisywać informację, czy liczby są sobie równe czy nie, lecz nie wykonuje tego. Wskaż odpowiedź, która dotyczy błędu.
Ilustracja przedstawia fragment kodu JavaScript, który znajduje się w prostokątnej ramce.
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Poprawna diagnoza to użycie przypisania w warunku instrukcji if zamiast porównania. Gdy w warunku pojawia się "=", zmienna dostaje nową wartość, a całe wyrażenie może zostać ocenione jako prawda/fałsz w nieoczekiwany sposób. Skutkiem jest błędna logika i brak oczekiwanego komunikatu o równości liczb.

Pełne wyjaśnienie:

W JavaScript w warunku instrukcji if powinno znaleźć się wyrażenie, które zwraca wartość logiczną (true/false) lub wartość interpretowaną jako prawda/fałsz. Jeżeli zamiast operatora porównania użyje się operatora przypisania "=", to program nie sprawdza równości, tylko zmienia wartość zmiennej.

Dlatego odpowiedź "W klauzuli if występuje przypisanie zamiast porównania." trafnie opisuje błąd logiczny: warunek nie porównuje dwóch liczb (np. przez "==" lub częściej zalecane "==="), lecz wykonuje przypisanie, a następnie wynik tego przypisania jest oceniany w kontekście warunku. To może powodować, że zawsze wchodzi się w jedną gałąź (if albo else) albo zachowanie zależy od przypisanej wartości, przez co komunikat o równości/nie-równości nie pojawia się zgodnie z założeniem.

Pozostałe odpowiedzi są typowymi "pułapkami":

  • "Przed klauzulą else nie powinno być średnika." – średnik może faktycznie zepsuć składnię w pewnych układach, ale to inny typ problemu: błąd składniowy/strukturalny, a nie klasyczny błąd logiczny porównania. W opisywanym przypadku kluczowy jest operator w warunku.
  • "Nieprawidłowo zadeklarowano zmienne." – zła deklaracja (np. brak let/const) może powodować inne skutki, ale nie tłumaczy wprost, dlaczego program nie rozróżnia równości liczb. Jeśli zmienne istnieją i kod się uruchamia, to sednem jest sposób sprawdzania warunku.
  • "Instrukcje wewnątrz sekcji if oraz else powinny być zamienione miejscami." – zamiana komunikatów mogłaby naprawić sytuację tylko wtedy, gdy warunek był poprawny, a program wypisywał odwrotne treści. Tu problemem jest to, że sam test równości nie działa, bo nie jest porównaniem.

W praktyce egzaminacyjnej warto zapamiętać zasadę: "=" zmienia dane, a "==/===" sprawdza warunek. Przy porównaniach w JavaScript najczęściej preferuje się "===", bo uwzględnia typy i zmniejsza liczbę nieoczekiwanych konwersji.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
"=" to przypisanie, a nie porównanie. W warunku if najpierw zmieniasz wartość zmiennej, a potem wynik tego przypisania jest oceniany jako true/false. To często daje nieoczekiwane wejście w jedną gałąź i psuje logikę programu.
"=" ustawia wartość (przypisanie). "==" porównuje z dopuszczeniem konwersji typów. "===" porównuje ściśle (wartość i typ), co zwykle jest bezpieczniejsze i przewidywalne w warunkach if.
Przypisanie jest poprawną składnią, więc interpreter nie zgłasza błędu składni. Problem jest logiczny: warunek nie sprawdza relacji między danymi, tylko zmienia dane. W efekcie program działa, ale zachowuje się inaczej niż zamierzał autor.
W wielu przypadkach średnik bezpośrednio po bloku if może "zamknąć" instrukcję i spowodować problem ze strukturą if...else. Jednak nie jest to ten sam błąd co pomylenie "=" z porównaniem. Na egzaminie trzeba rozpoznać, czy chodzi o składnię czy logikę.
Najczęstsza wskazówka to pojedynczy znak "=" w warunku (np. wewnątrz nawiasów if). Wtedy jedna ze zmiennych dostaje nową wartość. W narzędziach deweloperskich można to potwierdzić, podglądając wartości zmiennych przed i po wejściu do if.
Gdy w warunku if ma być sprawdzenie równości (np. "czy dwie liczby są równe"), a w kodzie widać operator "=". To klasyczny błąd logiczny: program nie wykonuje testu, tylko modyfikuje dane, co prowadzi do błędnych komunikatów.
Typowe skutki to: wejście zawsze w tę samą gałąź, zależność od przypisywanej wartości (np. 0 jako fałsz), oraz zmiana danych wejściowych. To może sprawić, że komunikat "równe/nie równe" nie pojawia się zgodnie z rzeczywistym porównaniem.
"===" nie wykonuje niejawnych konwersji typów, więc wynik jest bardziej przewidywalny. "==" może porównać wartości po konwersji, co bywa mylące (zwłaszcza w zadaniach egzaminacyjnych). Przy sprawdzaniu równości liczb "===" zwykle minimalizuje pułapki.
Często myli się to z problemami składni (np. średnik, nawiasy klamrowe), z deklaracją zmiennych (let/var/const) albo z "odwróconą" treścią komunikatów w if i else. Warto zawsze najpierw sprawdzić operator w samym warunku.
Najlepiej analizować krótkie fragmenty kodu i uruchamiać je w konsoli przeglądarki, obserwując wartości zmiennych. Pomagają też zadania typu "znajdź błąd" oraz porównywanie wariantów warunków z "=", "==" i "===". Regularny code review uczy uważności na pojedyncze znaki.
info

Około 50% zdających odpowiada poprawnie na to pytanie. trudne

W praktyce zawodowej kluczowe jest to, że poprawna diagnoza to użycie przypisania w warunku instrukcji if zamiast porównania.

Źródła:

  • MDN Web Docs: Assignment (=) - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Assignment (dostęp: 2026-02-27)
  • MDN Web Docs: Equality (==) - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Equality (dostęp: 2026-02-27)
  • MDN Web Docs: Strict equality (===) - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Strict_equality (dostęp: 2026-02-27)

Materiały:

  • Dokumentacja MDN dotycząca operatorów porównania i równości w JavaScript
  • Dokumentacja MDN dotycząca operatora przypisania w JavaScript
  • Materiały o instrukcji if...else w JavaScript (MDN lub podręcznik kursu)

Aktualizacja pytania: 31.03.2026

Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego