为什么返回值不是我在这个C程序中用宏预期的?

时间:2013-09-01 10:05:40

标签: c macros printf

当我运行以下代码时,返回值为11,但我希望它返回25.有人可以解释一下吗?

#include<stdio.h>
#define SQR(a) a*a

int main()
{
    int i=3;
    printf("%d",SQR(i+2));
    return 1;
}

2 个答案:

答案 0 :(得分:4)

需要更多括号。这样:

#define SQR(a) a*a

扩展到:

i+2*i+2

是:

3+2*3+2

这是11,因为*优先于+

您需要像这样定义宏:

#define SQR(a) ((a)*(a))

确保不会发生这种事情。

答案 1 :(得分:0)

宏与常规功能不同。

在重新处理过程中,所有的宏都会被它们定义的内容完全替换。在您的情况下,行:

 printf("%d",SQR(i+2));

替换为以下行:

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

所以,你会看到意外的结果。

正确的方法是:

#define SQR(a) ((a)*(a))

预处理器结果将是:

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

尝试了解这个错误。这类问题很难调试。