#include <stdio.h>
#define product(x) (x*x)
int main()
{
int i=3,j,k;
j = product(i++);
k = product(++i);
printf("j=%d,k=%d",j,k);
return 0;
}
为啥答案是 12,49? GCC环境
#include <stdio.h>
#define product(x) (x*x)
int main()
{
int i=3,j,k;
j = product(i++);
k = product(++i);
printf("j=%d,k=%d",j,k);
return 0;
}
为啥答案是 12,49? GCC环境
宏替换只是简单的符号替换
所以j = product(i++);相当于j = (i++) * (i++); 要现将两个i++压栈,第一个压入的数据将是3(注意是数值3),然后i自增了1(变成4)
之后第二个i++要压栈,由于是后++,压入的是4(是数值4),然后i自增1变成5,然后进行乘法,两个数弹栈,进行运算3*4得到12赋值给j
k = product(++i);//这句涉及到了引用压栈,但不是每个编译器都这样,所以一定要注意不同编译器结果很可能不同
也是k = (++i)*(++i),将两个++i先压栈,这里的前++和后++的区别不仅仅在于是先参与计算再加1还是先加1再参与计算
第一个参数入栈,先执行自增1(变为6了),然后将i的引用压栈(注意了是引用,不是数值)
第二个参数入栈,先执行自增1(变为7了),然后将i的引用压栈(注意了是引用,不是数值)
然后进行乘法,两个参数弹栈,进行运算i*i得到49赋值给k