Определите вывод программы с функцией‑ссылкой

Будут напечатаны 4, 12 и 28, каждое число с новой строки. refFunc возвращает ссылку на глобальный counter, поэтому присваивание результату вызова меняет сам counter.

Короткий ответ

Что ответить на собеседовании

Будут напечатаны 4, 12 и 28, каждое число с новой строки. refFunc возвращает ссылку на глобальный counter, поэтому присваивание результату вызова меняет сам counter.

Подробный разбор

Ответ с пояснениями

Условие

Нужно понять, какие значения будут напечатаны при выполнении следующего кода.

#include <iostream>

int counter = 2;

int& refFunc(int x){
    counter = counter + x;
    return counter;
}

int main(){
    int val = 2;
    std::cout << refFunc(val) << std::endl;
    refFunc(val) = 10;
    std::cout << refFunc(val) << std::endl;
    val = refFunc(val);
    std::cout << refFunc(val) << std::endl;
}

Ответ

Будут напечатаны 4, 12 и 28, каждое число с новой строки. refFunc возвращает ссылку на глобальный counter, поэтому присваивание результату вызова меняет сам counter.

Сначала counter увеличивается с 2 до 4. В refFunc(val) = 10 вызов сначала повышает его до 6, затем присваивание устанавливает 10. Следующий вывод добавляет val = 2 и печатает 12.

Далее val = refFunc(val) увеличивает counter до 14 и копирует это значение в val. Последний вызов добавляет уже 14 к 14 и печатает 28. Ссылка допустима, поскольку counter имеет статическую длительность хранения.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее