#include<stdio.h>
#include<conio.h>
#define PROD(x) (x*x)
void main()
{
clrscr();
int p=3,k;
k=PROD(p+1); //here i think value 3+1=4 would be passed to macro
printf("\n%d",k);
getch();
}
在我看来,输出应为16
,但我得7
。
有谁能告诉我为什么?
答案 0 :(得分:21)
宏已扩展,它们没有传递的值。在分配给k
的语句中查看宏扩展到的内容。
k=(p+1*p+1);
首选宏的功能,如果你必须使用宏,你应该做的最小值是完全括起参数。请注意,如果用户将其与具有副作用的表达式一起使用,即使这样也有可能出现意外。
#define PROD(x) ((x)*(x))
答案 1 :(得分:5)
这里的问题是PROD是一个宏,并且不会像你想要的那样表现。因此,它看起来像这样:
k = p+1*p+1
当然这意味着你有:
k = 3+1*3+1 = 7
答案 2 :(得分:5)
预处理器按如下方式扩展PROD(p + 1):
k = (p+1*p+1);
当p = 3时,这给出:3 + 1 * 3 + 1 = 7.
您应该按如下方式编写#define:
#define PROD(x) ((x)*(x))
答案 3 :(得分:2)
#define PROD(x) (x*x)
PROD(3+1)
被预处理程序更改为3+1*3+1
答案 4 :(得分:2)
宏不起作用。这些被名称
取代这将是p+1*p+1
答案 5 :(得分:2)
这是编译器在预处理器完成其工作后将要看到的内容:k = p + 1 * p + 1。当p = 3时,将其评估为k = 3 +(1 * 3)+1。因此7.
答案 6 :(得分:1)
这正是您应该使用函数而不是宏的原因。函数仅评估每个参数一次。为什么不试试
int prod(int x)
{return x * x; }
看到差异!