Эта строка:
double result = QUADRAT(++no);
расширяется до:
double result = ((++no) * (++no));
Способ, которым это заканчивается, эквивалентен:
no = no + 1;
no = no + 1;
result = no * no;
Этовыполняется таким образом, потому что приращения выполняются до умножения: препроцессор делает текстовую копию того, что вы передаете, поэтому он копирует «++ no», чтобы он дважды отображался в конечном коде, и приращение каждого ++ не происходит до вычисления результата.Чтобы исправить это, используйте встроенную функцию:
inline double QUADRAT(double x) { return x * x; }
Большинство современных компиляторов расширяют этот код без текстовой подстановки - они дадут вам что-то такое же быстрое, как определение препроцессора, но безопасность возникновения проблем, подобных той, с которой вы столкнулись.