KWALIFIKACJA INF3 - CZERWIEC 2014

PYTANIE NR 33.
Które wartości będą kolejno wypisane w wyniku działania przedstawionego skryptu?
Ilustracja przedstawia prostokątną ramkę, wewnątrz której znajduje się tekst będący fragmentem kodu źródłowego.
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
W skrypcie x startuje od 1. Wyrażenie ++x najpierw zwiększa x do 2 i tę wartość wypisuje. Następnie x-- wypisuje bieżące 2, a dopiero potem zmniejsza x do 1. Ostatnie wypisanie zmiennej x daje więc 1. Instrukcja ++y dotyczy niezainicjalizowanej zmiennej, ale jej wynik nie jest wypisywany.

Pełne wyjaśnienie:

Wynik skryptu wynika z kolejności wykonywania instrukcji oraz z tego, jak działają operatory inkrementacji i dekrementacji w JavaScript.

1) Stan początkowy
Ustawiane jest x = 1. Zmienna y jest zadeklarowana, ale nie ma przypisanej wartości, więc ma wartość undefined.

2) Instrukcja ++y
Preinkrementacja próbuje zwiększyć wartość y. Ponieważ y jest niezainicjalizowana, podczas konwersji do liczby powstaje wartość "not a number". Ważne w tym zadaniu: ta wartość nie jest nigdzie wypisywana, więc nie wpływa na widoczny wynik.

3) document.write(++x)
To preinkrementacja: najpierw zwiększa x, potem zwraca nową wartość. Zatem x zmienia się z 1 na 2 i wypisywane jest 2.

4) document.write(x--)
To postdekrementacja: najpierw zwraca bieżącą wartość, a dopiero potem zmniejsza zmienną. W tym momencie x wynosi 2, więc wypisuje 2, a następnie x zostaje zmniejszone do 1.

5) document.write(x)
Po wykonaniu postdekrementacji x ma już wartość 1, więc ostatnie wypisanie daje 1.

Dlaczego pozostałe odpowiedzi są błędne?

  • Wynik "2 1 1" zakłada, że po ++x od razu otrzymamy 2, ale x-- wypisze 1. To pomija fakt, że postdekrementacja wypisuje wartość sprzed zmniejszenia.
  • Wynik "1 2 1" sugeruje, że ++x wypisuje starą wartość (jakby była to postinkrementacja), co jest niezgodne z definicją preinkrementacji.
  • Wynik "1 2 2" dodatkowo zakłada, że x nie zostaje zmniejszone po x-- lub że x-- nie ma efektu ubocznego, co jest typowym błędem nieuwzględnienia zmiany stanu zmiennej.

Podsumowując, widoczne wypisania to kolejno: 2, spacja, 2, spacja, 1, czyli odpowiedź "2 2 1".

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Preinkrementacja ++x najpierw zwiększa wartość zmiennej, a dopiero potem zwraca wynik wyrażenia. Jeśli x = 1, to po ++x x staje się 2 i jednocześnie wyrażenie ma wartość 2. To ma znaczenie, gdy wynik jest od razu wypisywany.
Postdekrementacja x-- zwraca najpierw bieżącą wartość zmiennej, a dopiero potem zmniejsza ją o 1. Gdy x = 2, wyrażenie x-- ma wartość 2, ale po wykonaniu instrukcji zmienna x przyjmuje 1. To częste źródło błędów na egzaminie.
Po ++x zmienna x ma wartość 2 i ta wartość jest wypisana. Następnie x-- wypisuje jeszcze 2 (bo zwraca wartość sprzed zmniejszenia), a dopiero potem zmienia x na 1. Ostatni zapis wypisuje już 1, stąd sekwencja 2 2 1.
Jeśli zmienna jest zadeklarowana, ale nie ma przypisanej wartości, ma stan "nieokreślony". Próba użycia ++ wymusza konwersję do liczby i w praktyce może dać wartość nieliczbową. W tym typie zadań kluczowe jest też to, czy wynik tej operacji jest w ogóle wypisywany.
document.write wypisuje argument, ale najpierw musi go obliczyć. To oznacza, że efekty uboczne (np. zmiana x przez ++x lub x--) zajdą zanim cokolwiek zostanie wypisane. Kolejność jest więc: oblicz wyrażenie → ewentualnie zmień zmienne → wypisz wynik.
Atrybut language w znaczniku <script> jest uznawany za przestarzały; standardowo stosuje się type (historycznie) lub pomija się atrybut, bo domyślnie jest JavaScript. Na egzaminie ważniejsze jest jednak zrozumienie samego kodu i operatorów, a nie starych atrybutów.
Najlepiej zrobić krótką tabelę śledzenia: po każdej instrukcji zapisz aktualne x oraz to, co zostało wypisane. Przy ++x najpierw zmień x, potem zanotuj wypisanie. Przy x-- najpierw zanotuj wypisanie, a dopiero potem zmień x. To minimalizuje pomyłki.
Najczęściej myli się kolejność działania pre- i postoperatorów: uczniowie zakładają, że x-- od razu zmniejsza i dopiero potem "oddaje" wartość. Drugi błąd to nieuwzględnienie efektu ubocznego (zmiany x) między kolejnymi wypisaniami, przez co ostatnia wartość bywa źle oceniona.
W praktyce warto unikać ++ i -- w skomplikowanych wyrażeniach (np. w argumentach wielu funkcji), bo łatwo o błędną interpretację kolejności i efektów ubocznych. Czytelniejsze jest rozbicie na dwie linie: najpierw zmiana x, potem użycie x. Na egzaminie jednak trzeba umieć te operatory odczytać.
Tak. x++ to postinkrementacja: najpierw zwraca bieżącą wartość, potem zwiększa zmienną. Gdy x = 1, wyrażenie x++ wypisałoby 1, a dopiero później x stałby się 2. W zadaniach z wypisywaniem ma to bezpośredni wpływ na kolejność liczb w wyniku.
info

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

Według specjalistów z branży: "W skrypcie x startuje od 1. Wyrażenie ++x najpierw zwiększa x do 2 i tę wartość wypisuje."

Źródła:

  • MDN Web Docs: Increment (++) operator (JavaScript) - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Increment (dostęp: 2026-04-01)
  • MDN Web Docs: Decrement (--) operator (JavaScript) - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Decrement (dostęp: 2026-04-01)
  • MDN Web Docs: Document.write() - https://developer.mozilla.org/en-US/docs/Web/API/Document/write (dostęp: 2026-04-01)

Materiały:

  • Dokumentacja MDN: operator inkrementacji/dekrementacji w JavaScript
  • Dokumentacja MDN: document.write i ostrzeżenia dot. użycia
  • Kurs podstaw JavaScript (wyrażenia, operatory, typy danych)

Aktualizacja pytania: 03.04.2026



Aktualizacja pytania: 03.04.2026
📡 Brak połączenia internetowego