【问题标题】:Why the global variable gets doubled twice?为什么全局变量会翻倍?
【发布时间】:2019-10-19 12:06:59
【问题描述】:
#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。不知道为什么它把全局翻了两次。

【问题讨论】:

  • OT: about: scanf("%d",&amp;x); scanf() 系列函数返回成功的“输入转换说明符”的数量(在这种情况下,除 1 之外的任何返回值都表示发生了错误。
  • OT: about: #define abs(x) (x &lt; 0 ? -x : x) 始终在结果语句中的参数周围放置括号以避免“文本替换”错误

标签: c macros c-preprocessor


【解决方案1】:
#define abs(x) (x < 0 ? -x : x)

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

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

它最终调用doubleGlobalX() 两次,导致x 加倍。

【讨论】:

  • 宏替代预处理器标记,而不是文本。这些是不同的;一个后果是宏替换不能形成新的预处理器标记(没有## 运算符),而文本替换可以。
  • 问题不在于使用的语言。问题是该陈述是错误的,并且给人们提供了不正确的信息。
猜你喜欢
  • 2019-07-25
  • 2017-10-05
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多