Форум кафедры Техники и Электрофизики Высоких Напряжений

Онлайн-сообщество ТВНщиков
Гостям форума:

Добро пожаловать на форум по технике высоких напряжений!
Для получения доступа ко всем разделам необходимо зарегистрироваться


Текущее время: 21 май 2018, 21:37

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Домашнее задание №4.2
СообщениеДобавлено: 31 окт 2017, 02:40 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4242
Откуда: Д-3
Что выдаст следующая программа и почему?

#include <iostream>

int f(int i) { return ++i; }
int g(int&& i) { return i++; }
int& h(int& i) { return ++i; }

void main()
{
     int a {0};
     a += f(h(a));
     h(a)++;
     h(a) += h(a);
     h(a) += g(f(a));
     a <<= 1;
     std::cout << "a = " << a << std::endl;
}


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №4.2
СообщениеДобавлено: 01 ноя 2017, 00:05 
Не в сети
Аватара пользователя

Зарегистрирован: 26 мар 2016, 01:38
Сообщения: 21
Откуда: Москва
1) Присваиваем нуль а.
2) Вызов функции f (принимает копию числа), параметром которой является функция h, которая, в свою очередь, принимает ссылку на число (следовательно, работа не с копией) возвращает ссылку на результат операции в ней. В самой функции переданное значение подвергается действию оператора префиксного инкремента. Разворачиваем цепочку по порядку: функция h увеличивает число на 1 => a = 1, ссылка на a=1 передаётся в функцию f, где оно увеличивается на единицу и отсылает полученное значение в main. Тогда, по итогу, в main-е выполняется операция 1+=2 и результат первой строки вычислений 3.
3) Функция h принимает параметр а, равный трём, увеличивает его на 1 (теперь а = 4), после чего возвращает ссылку к постфиксному инкременту, который совершает действие над ссылкой объекта. Но, т.к. оператор по сути является сам функцией, то ему можно передавать и ссылки на содержимое ячеек памяти над содержимым которой и будет совершатся операция. Результат строки a = 5.
4) Согласно приоритету операций, сначала вызываются функции, потом операторы. В таком случае, по аналогии с предыдущими строками: обе функции h увеличиваются значение a на единицу, после чего результат складывается. Тогда a = (5+1+1) + (5+1+1) = 14.
5) Усложнение предыдущей строки: в правой части функция g принимает rvalue ссылку результата операции функции f и подвергается операции постинкремента. Особенностью данной операции является то, что rvalue ссылка как бы "подменяет" параметр а в вычислениях, т.к. указывает на временный объект. Тогда, получаем: f(a) возвращает значение 15 (но не перезаписывает а в его ячейке), которое принимает функция g и отправляет обратно, но уже как объект не связанный с a. В левой части к изначальному а (равному 14), прибавляется единица. в результате: 15+15 = 30 - результат действий строки.
6) В данной строке происходит побитовый сдвиг влево, совмещённый с присваиванием (да, пришлось загуглить). 30 в двоичном коде: 11110. Тогда ячейке памяти присваивается значение 111100, которое равно 60.
7) Результат - 60.
P.S. скажите, пожалуйста, если я где-то нарушил логику, но было круто =)

_________________
' ̿'\̵͇̿̿\з=(◕_◕)=ε/̵͇̿̿/'̿'̿ ̿


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №4.2
СообщениеДобавлено: 01 ноя 2017, 00:43 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4242
Откуда: Д-3
Четко!
Пора новое ДЗ придумывать :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB