我不了解以下宏的工作原理

时间:2014-04-06 15:49:38

标签: c++ macros

以下宏

的数学等价方程是什么?
#define SQ(a) (a*a )
int answer SQ(2 + 3 );

此案例的输出为11 和

int answer SQ(2 + 4);

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

2 个答案:

答案 0 :(得分:1)

您定义的宏缺少括号以保持算术正常工作。请记住,预处理器宏只是单独进行文本替换。因此,当您展示时,通过调用它可以获得的内容扩展为

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

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

将您的宏写为

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

获得您期望的结果。

答案 1 :(得分:1)

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

你应该写这样的东西:

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

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

同样的逻辑成立如果你用4替换4,你将得到11,并使用更正后的宏25。

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