0

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

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

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

2 回答 2

4

需要更多括号。这个:

#define SQR(a) a*a

扩展为:

i+2*i+2

这是:

3+2*3+2

这是 11 因为*优先于+.

您需要像这样定义宏:

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

以确保这种事情不会发生。

于 2013-09-01T10:10:55.637 回答
0

宏与常规函数不同。

在重新处理期间,所有宏都被它们所定义的完全替换。在您的情况下,该行:

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

替换为以下行:

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

所以,你在那里看到了意想不到的结果。

正确的方法是:

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

预处理器结果将是:

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

试着学习这个错误。这类问题很难调试。

于 2013-09-01T10:58:45.417 回答