Непонятное выражение ++x+-+y+-+z++

#include <iostream>
int x,y,z;
auto& cout = (std::cout << ++x+-+y+-+z++);
int main(){}

Как работает этот код и почему выводит 1?


Ответы (2 шт):

Автор решения: KoVadim

Все логично добавим пару пробелов, что бы было очевидно

++x + -+y + -+z++

то есть, у нас три слагаемых, а также есть унарные плюсы (которые ни на что не влияют) и унарные минусы, которые меняют знак.

упростим

++x - y - z++

теперь уже легче. значение x будет увеличено до сложения, там будет 1. y не меняется, там ноль. z будет изменен, но после сложения, поэтому там ноль. 1 - 0 - 0 == 1.

P.S. Некоторые могут решить, что здесь не инициализированные переменные x,y,z, но нет, они инициализируются нулем.

P.S. - на собеседовании, когда я получил подобный вопрос, я сказал: "а в коде такое тоже есть?" и не принял оффер, хотя он и был хороший.

→ Ссылка
Автор решения: Harry

Ну давайте разбирать...

#include <iostream>
int x,y,z;

Раз эти переменные объявлены в глобальной области видимости, они обнулены.

auto& cout = (std::cout << ++x+-+y+-+z++);

Переменная cout в глобальном пространстве имен оказывается ссылкой, возвращаемой выражением

std::cout << ++x+-+y+-+z++

которое возвращает ссылку на std::cout, но при этом выводит... Итак, что же оно выводит?

++x      // - x становится равным 1, и возвращает 1.

+ - +y   // - т.е. прибавить минус от плюс `y`

+y == 0
-(+y) == 0

так что прибавляется 0

+-+z++ 

То же самое, только z++ при вычислении устанавливает z равной 1, но возвращает 0. Так что опять - просто прибавить 0.

Итак, выражение выводит 1.

Все, все глобальные переменные инициализированы. Переходим к main(), и видим, что она ничего не делает.

Программа завершена. Все ее внешнее проявление - вывод 1...

→ Ссылка