KWALIFIKACJA INF2 + INF3 - CZERWIEC 2011

PYTANIE NR 26.
Wynikiem działania programu jest wyświetlenie liczb
Ilustracja przedstawia fragment kodu w języku C++, który jest częścią pytania egzaminacyjnego związanego z kwalifikacjami
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
W wyrażeniu w += (a++) + (++b) operator a++ zwraca 7, a dopiero potem zwiększa a do 8. Operator ++b najpierw zwiększa b z 3 do 4 i zwraca 4. Do w=1 dodaje się 7+4=11, więc w=12. Program wypisze 12 oraz 8.

Pełne wyjaśnienie:

Kluczowe jest rozróżnienie dwóch operatorów inkrementacji w C++:

  • postinkrementacja a++ – w danym wyrażeniu używa "starej" wartości, a dopiero po jej użyciu zwiększa zmienną o 1,
  • preinkrementacja ++b – najpierw zwiększa zmienną o 1, a następnie w wyrażeniu pojawia się już wartość zwiększona.

W programie ustawiono: a=7, b=3, w=1. Następnie wykonywane jest:

w += (a++) + (++b)

Kroki śledzenia (trace):

  1. Fragment (a++) zwraca do sumy wartość 7, a po tym kroku zmienna a staje się 8.
  2. Fragment (++b) najpierw zmienia b z 3 na 4 i zwraca do sumy wartość 4.
  3. Suma w nawiasach to 7 + 4 = 11.
  4. Operator += dodaje tę sumę do aktualnego w: było w=1, więc po dodaniu w=1+11=12.

Na końcu instrukcja wyjścia wypisuje w oraz a oddzielone spacją. Ponieważ w=12 i a=8, wynikiem są liczby: 12 i 8.

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

  • "12 i 7" pomija skutek uboczny postinkrementacji – po wykonaniu wyrażenia a nie pozostaje równe 7.
  • "11 i 8" to typowy błąd nieuwzględnienia początkowego w=1 i działania += (to nie jest zwykłe przypisanie).
  • "13 i 8" wynika zwykle z błędnego policzenia składników sumy (np. przyjęcia, że a++ zwraca 8 zamiast 7) lub z podwójnego dodania 1.

Wskazówka egzaminacyjna: zawsze zapisuj osobno (1) wartość zwracaną przez a++/++a oraz (2) nową wartość zmiennej po wykonaniu operatora. To ogranicza pomyłki w wyrażeniach złożonych.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Postinkrementacja a++ używa w wyrażeniu bieżącej (starej) wartości zmiennej, a dopiero potem zwiększa ją o 1. Czyli najpierw "zwraca", potem "zmienia stan". To ważne, gdy wynik wyrażenia i nowa wartość zmiennej są używane w kolejnych instrukcjach.
Preinkrementacja ++a najpierw zwiększa wartość zmiennej o 1, a dopiero potem ta nowa wartość bierze udział w wyrażeniu. W praktyce oznacza to, że w miejscu użycia operatora pojawia się już wartość po zwiększeniu.
Operator += wykonuje przypisanie złożone: dodaje wartość z prawej strony do aktualnej wartości zmiennej po lewej stronie i zapisuje wynik. Przykład: jeśli w=1, to po w += 11 otrzymasz w=12.
Pomyłka wynika zwykle z pominięcia początkowej wartości w. W programie w startuje od 1, a następnie do w dodawane jest 11 (z wyrażenia (a++)+(++b)). To daje 1 + 11 = 12, więc pierwsza liczba to 12.
Najpierw ustal wartości startowe. Potem rozpisz osobno: a++ daje do sumy starą wartość a, a ++b daje do sumy nową wartość b po zwiększeniu. Na końcu dodaj te dwa składniki i dopiero wtedy zastosuj wynik w dalszej części instrukcji.
W tym zadaniu kluczowe są skutki operatorów a++ i ++b. Niezależnie od kolejności obliczenia składników sumy, zmienna a zostanie zwiększona o 1, a b również o 1, a do w trafi suma wartości zwracanych przez te operatory.
Najczęstsze błędy to: utożsamianie a++ z ++a, ignorowanie tego, że a++ zmienia zmienną (po wyrażeniu a ma inną wartość), oraz nieuwzględnianie wartości początkowej przy +=. Pomaga rozpisanie kroków na kartce.
W praktyce (kod produkcyjny) często unika się złożonych wyrażeń z a++, bo są mniej czytelne i łatwiej o błąd. W zadaniach egzaminacyjnych takie konstrukcje pojawiają się jednak celowo, by sprawdzić rozumienie operatorów, więc warto umieć je przeanalizować.
Stosuj technikę "trace": wypisz wartości zmiennych przed instrukcją, potem rozpisz, co zwraca każdy operator i jak zmienia zmienne. Na końcu podstaw do += i dopiero wtedy zapisz wartości końcowe. To dokładnie to, co robi debugger, tylko ręcznie.
Podobnie mylące bywają: -- (pre/postdekrementacja), operatory przypisania złożonego (-=, *=, /=) oraz użycie kilku efektów ubocznych w jednym wyrażeniu. Na egzaminie zawsze warto rozdzielać je na kroki i pilnować "co jest zwracane", a "co jest zmieniane".
info

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

W praktyce zawodowej kluczowe jest to, że w wyrażeniu w += (a++) + (++b) operator a++ zwraca 7, a dopiero potem zwiększa a do 8.

Źródła:

  • cppreference.com: "Increment and decrement operators" (C++) https://en.cppreference.com/w/cpp/language/operator_incdec - dostęp 2026-03-01
  • cppreference.com: "Compound assignment operators" (C++) https://en.cppreference.com/w/cpp/language/operator_assignment - dostęp 2026-03-01

Materiały:

  • Dokumentacja cppreference dotycząca operatorów inkrementacji w C++
  • Podręcznik/kompendium C++: rozdział o operatorach i wyrażeniach
  • Ćwiczenia z ręcznego śledzenia wykonania programu (trace) dla prostych fragmentów kodu

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego