KWALIFIKACJA INF3 - WRZESIEŃ 2014

PYTANIE NR 28.
Jaka wartość zostanie wypisana na standardowym wyjściu dla zamieszczonego w ramce fragmentu programu napisanego w języku C++ ?
Ilustracja przedstawia fragment kodu w języku C++, który jest umieszczony w prostokątnej ramce.
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Ustalenie wyniku wymaga prześledzenia działania operatorów w pokazanym fragmencie C++ (kolejność ewaluacji, skutki uboczne, priorytety) i tego, jaka wartość ostatecznie trafia do strumienia wyjścia.
Zgodnie z kluczem na standardowe wyjście wypisywana jest wartość 3.

Pełne wyjaśnienie:

W zadaniach typu "co zostanie wypisane na standardowym wyjściu" kluczowe jest rozumienie, że w C++ wynik nie zależy wyłącznie od arytmetyki, ale także od kolejności ewaluacji wyrażeń oraz skutków ubocznych (np. inkrementacji/dekrementacji). Aby poprawnie odpowiedzieć, należy krok po kroku przeanalizować, jakie wartości są używane w danym momencie oraz kiedy zmienna jest modyfikowana.

Poprawna odpowiedź to 3, ponieważ po wykonaniu operacji w przedstawionym fragmencie programu taka właśnie wartość zostaje przekazana do standardowego wyjścia (np. przez wypisanie wartości wyrażenia lub zmiennej po modyfikacjach).

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

  • 2 – typowy błąd wynika z traktowania inkrementacji/dekrementacji jak "natychmiastowej zmiany" bez rozróżnienia formy pre/post albo z pominięcia jednego z kroków ewaluacji.
  • 32 – taka odpowiedź często bierze się z mylnej interpretacji jako konkatenacji/łączenia wartości lub z błędnego odczytania tego, co jest wypisywane (np. przyjęcia, że wypisywane są dwie liczby bez separatora).
  • 4 (gdyby się pojawiło jako dystraktor) – bywa skutkiem założenia, że inkrementacja "dodaje 1" w innym miejscu niż rzeczywiście wynika to z semantyki wyrażenia.

W praktyce egzaminacyjnej warto pamiętać o dwóch zasadach: (1) unikaj zgadywania – zapisuj stany zmiennych po każdym kroku, (2) zwracaj uwagę na standard i reguły ewaluacji, bo niektóre złożone konstrukcje mogą zachowywać się różnie lub być niejednoznaczne między wersjami języka.

Dodatkowe pytania

Dodatkowe pytania (FAQ):

Najpewniejsza metoda to rozpisać stan każdej zmiennej po kolei i zaznaczyć moment użycia wartości w wyrażeniu.

Oddzielnie notuj: wartość używaną oraz moment modyfikacji (np. przy pre/post inkrementacji). To ogranicza zgadywanie.

Kolejność ewaluacji mówi, w jakiej kolejności obliczane są części wyrażenia i kiedy zachodzą skutki uboczne.

W złożonych wyrażeniach może to wpływać na wynik albo prowadzić do niejednoznaczności, więc bez tej wiedzy łatwo o błąd w zadaniach "co zostanie wypisane".

Preinkrementacja najpierw zwiększa wartość, a potem zwraca wynik.

Postinkrementacja zwraca starą wartość, a dopiero potem zwiększa zmienną.

W zadaniach z wypisywaniem to rozróżnienie decyduje o tym, co trafia na wyjście.

Standardy C++ ewoluują i doprecyzowują reguły (np. ewaluacji, sekwencjonowania skutków ubocznych).

Jeśli pytanie nie wskazuje wersji standardu, niektóre konstrukcje mogą być interpretowane inaczej albo być uznane za niejednoznaczne, co wpływa na "aktualność" klucza odpowiedzi.

Niezdefiniowane zachowanie oznacza, że standard nie określa wyniku programu i kompilator może zrobić "cokolwiek".

Często pojawia się przy mieszaniu modyfikacji tej samej zmiennej i jej odczytu w jednym wyrażeniu bez gwarantowanego sekwencjonowania. W testach może to czynić zadanie spornym.

Najczęstsze pomyłki to: mylenie pre/post inkrementacji, ignorowanie priorytetów operatorów, nieuwzględnienie skutków ubocznych oraz "liczenie jak w matematyce" bez semantyki C++.

Pomaga notowanie stanów zmiennych i rozbijanie złożonych wyrażeń na proste kroki.

Stosuj symulację ręczną: zapisuj wartości zmiennych w tabeli i po każdym operatorze aktualizuj stan.

Jeśli są operatory ++/--, zapisuj osobno wartość "zwracaną" i wartość zmiennej po modyfikacji. To odtwarza tok wykonania bez kompilatora.

Odpowiedź typu 32 często wynika z błędnego założenia, że program wypisuje dwie liczby "obok siebie" bez separatora lub że wynik powstaje przez sklejenie wartości.

W C++ trzeba rozróżnić: jedno wyrażenie wypisywane raz vs. kilka wypisań w sekwencji i ich formatowanie.

Warto unikać ich zawsze, gdy czytelność spada albo gdy wynik zależy od subtelnych reguł ewaluacji.

W praktyce lepiej rozbić zapis na kilka instrukcji: zmiana zmiennej w osobnej linii i dopiero potem użycie wartości. Kod jest wtedy deterministyczny i łatwiejszy w utrzymaniu.

Dobre zadanie powinno podawać cały fragment kodu w treści (nie tylko w grafice) oraz doprecyzować standard kompilacji, jeśli ma to znaczenie.

Dzięki temu istnieje jedna poprawna odpowiedź, a wynik nie zależy od interpretacji lub różnic między wersjami języka.

info

Statystycznie 60% uczniów zna prawidłową odpowiedź. średnie

Źródła:

  • cppreference.com: Order of evaluation (C++) – https://en.cppreference.com/w/cpp/language/eval_order (dostęp: 2026-02-18)
  • cppreference.com: Increment/decrement operators – https://en.cppreference.com/w/cpp/language/operator_incdec (dostęp: 2026-02-18)
  • cppreference.com: Undefined behavior – https://en.cppreference.com/w/cpp/language/ub (dostęp: 2026-02-18)

Materiały:

  • Dokumentacja cppreference dotycząca kolejności ewaluacji i operatorów
  • Podręczniki wprowadzające do C++ omawiające skutki uboczne i priorytety operatorów
  • Materiały o dobrych praktykach: pisanie deterministycznych wyrażeń i unikanie "trików" składniowych

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego