#define abs(x) (x < 0 ? -x : x)
Макросы выполняют текстовую подстановку. Определение макроса abs()
, подобного этому, является хорошо известной ловушкой, поскольку в итоге он оценивает x
дважды. Если бы это была функция, это было бы хорошо, но как макрос это проблема. abs(doubleGlobalX())
расширяется до:
doubleGlobalX() < 0 ? -doubleGlobalX() : doubleGlobalX()
В итоге он вызывает doubleGlobalX()
дважды, что приводит к удвоению x
.