【问题标题】:Macro argument with different results [duplicate]具有不同结果的宏参数[重复]
【发布时间】:2016-04-21 14:22:35
【问题描述】:

所以我在 C 程序中的宏调用中遇到了这个相当“顽固”的问题。 我使用的宏是:

#define MACRO(X) X*X

问题是当我这样做时

printf("%d",MACRO(3));

它显示 9 作为结果(这是正确的)。仅当我将 3 作为 2+1 传递如下:

printf("%d",MACRO(2+1));

奇怪地显示结果为 5。 谁能告诉我为什么?

【问题讨论】:

  • MACRO(2+1) 扩展为2+1*2+1,你需要( )
  • 2+1*2+1 = 2 + (1 * 2) + 1 = 5
  • @BLUEPIXY - 你的 cmets 非常值得回答..
  • 看起来像是 The need for parentheses in macros in C 的骗子,它使用了宏 #define SQR(x) (x*x),我已经 VTC 打错了,但这将是一个更好的骗子目标。
  • 请记住宏会直接替换文本。要获得正确的操作,请将宏主体中的每个“x”元素用括号括起来,就像在调用宏的位置编写宏主体一样。

标签: c macros


【解决方案1】:
printf("%d",MACRO(2+1));

经过预处理会变成

printf("%d",2+1*2+1);

由于乘法比加法精度高,所以会打印 5;

要解决此问题,您必须按如下方式定义宏

#define MACRO(X) (X)*(X)

【讨论】:

  • 我会使用 ((X)*(X)) 但可能是多余的
【解决方案2】:

你需要像这样定义你的宏

#define MACRO(X) (X)*(X)

宏只是一个文本扩展,因此您的以下代码被这样解释...

printf("%d", 2+1*2+1);

按照操作顺序,您可以看到结果是 5。

【讨论】:

  • 谢谢。我没有注意到那个。
猜你喜欢
  • 1970-01-01
  • 2011-01-02
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 2015-08-30
  • 1970-01-01
相关资源
最近更新 更多