c中使用#Define定义的函数

时间:2016-02-10 17:13:46

标签: c c-preprocessor

#include <stdio.h>
#include <stdlib.h>
#define PATRAT(x) x*x+x;

int main()
{
    int x,y,z,t;

    x = 104;
    y = PATRAT(x - 1);
    z = PATRAT(y++);
    t = ++PATRAT(x);

     printf ("%d %d %d", y, z, t);

    return 1;
}

鉴于此代码,结果是y = 105,z = 10506,t = 11130,我不明白为什么。你能解释一下吗?

2 个答案:

答案 0 :(得分:3)

宏扩展。

如果使用GCC编译-E以查看所有包含和宏之后的输出。然后它会变得清晰。

答案 1 :(得分:3)

预处理器将其扩展如下:

y = x - 1*x - 1+x - 1;;
z = y++*y+++y++;;
t = ++x*x+x;;

在我们使人类可读之后,它说:

y = x - (1 * x) - 1 + x - 1;
z = (y++ * y++) + y++;
t = (++x * x) + x;

未定义的行为 because we're modifying y without sequence points in between,因此任何输出都是可能的。