#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,我不明白为什么。你能解释一下吗?
答案 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,因此任何输出都是可能的。