为什么全局变量会翻倍两次?

Nur*_*san 1 c macros c-preprocessor

#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;
}
Run Code Online (Sandbox Code Playgroud)

当输入5为时,此代码的输出为20。当输入为时15,输出为60。不知道为什么它将两倍于全局。

Joh*_*ica 7

#define abs(x) (x < 0 ? -x : x)
Run Code Online (Sandbox Code Playgroud)

宏执行文本替换。abs()像这样定义一个宏是一个众所周知的陷阱,因为它最终需要x两次评估。如果它是一个函数,那会很好,但是作为宏,这是一个问题。abs(doubleGlobalX())扩展为:

doubleGlobalX() < 0 ? -doubleGlobalX() : doubleGlobalX()
Run Code Online (Sandbox Code Playgroud)

最后调用doubleGlobalX()两次,导致x两次翻倍。