当我运行以下代码时,返回值为11,但我希望它返回25.有人可以解释一下吗?
#include<stdio.h>
#define SQR(a) a*a
int main()
{
int i=3;
printf("%d",SQR(i+2));
return 1;
}
答案 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)));
尝试了解这个错误。这类问题很难调试。