Нил Баттерворт, Марк и Павел правы.
SQUARE (++ y) расширяется до ++ y * ++ y, что увеличивает значение y в два раза.
Другая проблема, с которой вы можете столкнуться: КВАДРАТ (a + b) расширяется до a + b * a + b, который не является (a + b) * (a + b), но a + (b * a) + b. Вы должны позаботиться о добавлении скобок вокруг элементов, когда это необходимо при определении макросов: #define SQUARE (X) ((X) * (X)) немного менее рискованно. (Ян Кемп написал это первым в своем комментарии)
Вместо этого вы можете использовать встроенную функцию шаблона (не менее эффективную во время выполнения), например, такую:
template <class T>
inline T square(T value)
{
return value*value;
}
Вы можете проверить это работает:
int i = 2;
std::cout << square(++i) << " should be 9" << std::endl;
std::cout << square(++i) << " should be 16" << std::endl;
(не нужно писать
square<int>(++i)
потому что тип int неявный для i)