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. скажите, пожалуйста, если я где-то нарушил логику, но было круто =)
|