#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/

10-12 14:12