KWALIFIKACJA INF2 + INF3 - PRÓBNY

PYTANIE NR 9.
Przeanalizuj poniższy kod w języku C++ i wskaż, jaką wartość przyjmie zmienna y po jego wykonaniu.

void dodaj_piec(int a) { a = a + 5; }
int main() { int x = 2, y; dodaj_piec(x); y = x + 5; }
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Funkcja dodaj_piec ma parametr int a, więc argument jest przekazywany przez wartość (tworzona jest kopia). Zmiana a=a+5 nie modyfikuje x, które pozostaje 2. Potem y=x+5, więc y=7.

Pełne wyjaśnienie:

W C++ o tym, czy funkcja może zmienić zmienną przekazaną jako argument, decyduje sposób przekazania parametru. W sygnaturze void dodaj_piec(int a) parametr a jest przekazywany przez wartość, czyli do funkcji trafia kopia argumentu.

Krok po kroku:

  • W main ustawiane jest x=2.
  • Wywołanie dodaj_piec(x) tworzy lokalną kopię: w funkcji a=2.
  • Instrukcja a = a + 5 zmienia tylko kopię, więc po tej operacji a=7, ale x nadal = 2.
  • Po powrocie do main wykonywane jest y = x + 5, zatem y = 2 + 5 = 7.

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

  • Wartość 2 wynikałaby z pominięcia przypisania do y lub błędnego założenia, że y ma przyjąć x, a nie x+5.
  • Wartość 5 to typowy błąd "dodaj 5 do zera" albo pomylenie inicjalizacji x=2 z inną wartością.
  • Wartość 10 mogłaby się pojawić, gdyby ktoś założył, że zarówno funkcja zmienia x (do 7), jak i potem jeszcze raz dodajemy 3 lub 5 w inny sposób; nie wynika to z podanego kodu.

Warto zapamiętać: aby funkcja modyfikowała argument, parametr musi być referencją, np. int& a (albo wskaźnikiem). Wtedy zmiana byłaby widoczna poza funkcją.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Przekazanie przez wartość oznacza, że funkcja dostaje kopię argumentu. Zmiany wykonane na parametrze wewnątrz funkcji nie wpływają na zmienną używaną przy wywołaniu. To bezpieczne (brak efektów ubocznych), ale może być kosztowne dla dużych obiektów.
Ponieważ funkcja ma sygnaturę dodaj_piec(int a), więc do a trafia kopia x. Instrukcja a=a+5 zmienia tylko lokalny parametr. Po wyjściu z funkcji kopia znika, a x w main pozostaje bez zmian.
Najpierw ustawiane jest x=2. Funkcja zmienia tylko kopię parametru, więc x nadal = 2. Następnie wykonuje się y = x + 5, czyli y = 2 + 5 = 7. Klucz to sprawdzenie, czy parametr jest referencją.
Gdy parametr ma postać int&, staje się aliasem argumentu. Wtedy zmiana wewnątrz funkcji dotyczy tej samej zmiennej w main. W takim wariancie x zostałoby zwiększone o 5, a dalsze obliczenie y=x+5 dałoby inną wartość.
Tak, jeśli parametr ma typ np. int a (bez & i bez wskaźnika), to przekazywanie jest przez wartość. Żeby przekazywać przez referencję, trzeba jawnie użyć zapisu typ&, a dla wskaźników typ*.
Najczęstsze pomyłki to: zakładanie, że każda funkcja "zmienia argument", nieuwzględnienie braku & w parametrze, mylenie referencji ze wskaźnikiem oraz mechaniczne liczenie "+5" bez prześledzenia, na jakiej zmiennej operacja jest wykonywana (na kopii czy oryginale).
Przez wartość przekazuj, gdy obiekt jest mały (np. liczby) lub gdy celowo chcesz kopii i braku skutków ubocznych. Przez referencję przekazuj, gdy funkcja ma modyfikować argument albo gdy obiekt jest duży i chcesz uniknąć kopiowania. Często stosuje się też const referencję.
const referencja (np. const T&) pozwala przekazać argument bez kopiowania, ale jednocześnie zabrania jego modyfikacji w funkcji. To częsty kompromis: wydajność jak przy referencji i bezpieczeństwo jak przy przekazywaniu "tylko do odczytu".
Wynik 12 pojawiłby się, gdyby funkcja faktycznie zmieniła x z 2 na 7, a potem w main wykonało się y = x + 5. W tym kodzie parametr jest jednak przekazywany przez wartość, więc x nie zmienia się i nie ma podstaw do takiego wyniku.
Sprawdź sygnaturę funkcji: jeśli parametr to zwykły typ (np. int a), zmiany dotyczą kopii. Jeśli widzisz & (np. int& a) lub wskaźnik (np. int* a), funkcja może zmienić oryginał (zależnie od kodu w środku).
info

Około 56% zdających odpowiada poprawnie na to pytanie. średnie

Eksperci podkreślają: "Funkcja dodaj_piec ma parametr int a, więc argument jest przekazywany przez wartość (tworzona jest kopia)."

Źródła:

  • cppreference.com – "Function declaration" (sekcja: parameters) https://en.cppreference.com/w/cpp/language/function - dostęp 2026-02-27
  • cppreference.com – "References" (podstawy referencji, int&) https://en.cppreference.com/w/cpp/language/reference - dostęp 2026-02-27
  • Microsoft Learn – C++ documentation: "References (C++)" https://learn.microsoft.com/en-us/cpp/cpp/references-cpp - dostęp 2026-02-27

Materiały:

  • Dokumentacja C++: sekcje o deklaracji funkcji i parametrach
  • Ćwiczenia: porównanie wersji funkcji z parametrem int oraz int&
  • Kursy/lekcje o 'pass-by-value' i 'pass-by-reference' z przykładami

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego