C程序输出令人困惑

时间:2011-02-26 16:39:23

标签: c

#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

有谁能告诉我为什么?

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; }

看到差异!