Почему глобальная переменная удваивается дважды? - PullRequest
1 голос
/ 19 октября 2019
#include <stdio.h>
#define abs(x) (x < 0 ? -x : x)
int x;
int doubleGlobalX()
{
    x*=2;
    return x;
}

int main()
{
    scanf("%d",&x);//5
    printf("%d\n",abs(doubleGlobalX()));//20
    return 0;
}

Когда ввод 5, вывод этого кода 20. Когда ввод 15, вывод 60. Не знаю, почему это удваивает глобальный в два раза.

1 Ответ

7 голосов
/ 19 октября 2019
#define abs(x) (x < 0 ? -x : x)

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

doubleGlobalX() < 0 ? -doubleGlobalX() : doubleGlobalX()

В итоге он вызывает doubleGlobalX() дважды, что приводит к удвоению x.

...