用#Define 在 c 中定义的函数
A function defined in c with #Define
#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,我不明白为什么。能解释一下吗?
宏展开。
如果使用带-E 的GCC 编译来查看所有包含和宏之后的输出。然后就清楚了。
预处理器将其展开如下:
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,所以任何输出都是可能的。
#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,我不明白为什么。能解释一下吗?
宏展开。
如果使用带-E 的GCC 编译来查看所有包含和宏之后的输出。然后就清楚了。
预处理器将其展开如下:
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,所以任何输出都是可能的。