#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
。不知道为什么它能让全球翻倍。 最佳答案
#define abs(x) (x < 0 ? -x : x)
宏执行文本替换定义像这样的
abs()
宏是一个众所周知的陷阱,因为它最终会对x
求值两次如果它是一个函数,那就没问题,但作为一个宏,这是个问题abs(doubleGlobalX())
扩展到:doubleGlobalX() < 0 ? -doubleGlobalX() : doubleGlobalX()
它最后调用
doubleGlobalX()
两次,导致x
加倍。关于c - 为什么全局变量会翻倍两次?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58463510/