【问题标题】:I don't understand the working of the following Macro [closed]我不明白以下宏的工作[关闭]
【发布时间】:2014-04-06 15:49:38
【问题描述】:

跟随宏的数学等价方程是什么

#define SQ(a) (a*a )
int answer SQ(2 + 3 );

这种情况下的输出是 11 而对于

int answer SQ(2 + 4);

是 14 我无法从输出中找出方程式。

【问题讨论】:

  • 是什么阻止你自己测试它?
  • 你完全错误地理解 Stack Overflow 是关于什么的。
  • 是的,输出是 11,但我不知道它的工作原理。
  • 它扩展为2+3*2+3。这是非常微不足道的。

标签: c++ macros


【解决方案1】:

您定义的宏缺少括号以保持算术按您的意愿工作。请记住,预处理器宏仅进行文本替换。因此,如您所显示的那样调用它会得到什么扩展为

int answer (2 + 4 * 2 + 4);

根据运算符优先级,结果为14

把你的宏写成

#define SQ(a) ((a)*(a))

得到你期望的结果。

【讨论】:

  • 感谢这个家庭作业问题完全搞糊涂了
【解决方案2】:

SQ(2 + 4) 扩展为 2+4*2+4 = 14,因为您没有在宏中使用括号。对于新手来说这是一个通用的宏陷阱,因为宏在这方面不太安全,因为它们只是被预处理器作为原始字符串处理。

你应该这样写:

#define SQ(a) ((a)*(a))

这将扩展为:(2+4)*(2+4) = 36。

同样的逻辑也成立,如果你用 3 代替 4,你会得到 11,用更正的宏 25。

话虽如此,你真的不应该像那样初始化一个整数。一般的方式是使用显式赋值。

【讨论】:

  • 感谢您提供更多信息..
  • 不客气,但请买一本 Bjarne 写的书。
猜你喜欢
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 2012-01-14
  • 2015-03-25
  • 1970-01-01
相关资源
最近更新 更多