Непонятное выражение ++x+-+y+-+z++
#include <iostream>
int x,y,z;
auto& cout = (std::cout << ++x+-+y+-+z++);
int main(){}
Как работает этот код и почему выводит 1?
Ответы (2 шт):
Все логично добавим пару пробелов, что бы было очевидно
++x + -+y + -+z++
то есть, у нас три слагаемых, а также есть унарные плюсы (которые ни на что не влияют) и унарные минусы, которые меняют знак.
упростим
++x - y - z++
теперь уже легче. значение x будет увеличено до сложения, там будет 1. y не меняется, там ноль. z будет изменен, но после сложения, поэтому там ноль. 1 - 0 - 0 == 1.
P.S. Некоторые могут решить, что здесь не инициализированные переменные x,y,z, но нет, они инициализируются нулем.
P.S. - на собеседовании, когда я получил подобный вопрос, я сказал: "а в коде такое тоже есть?" и не принял оффер, хотя он и был хороший.
Ну давайте разбирать...
#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...