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。不知道为什么它将两倍于全局。
#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两次翻倍。