#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
因为一个是先运算再执行,一个是先执行在运算
顺着答案的思路 逆向推导一下 首先 j = product(i=3(i++ now i=4) ,i=4(i++ now i=5);
j=12(3x4);
i++;//(now i=6)
i++;//(now i=7)
k = product (i,i);//7x7
k=49;//
这主要是学会区别前置++,后置++和define定义的宏如何传参的问题
前置++是先加加再使用,后置++是先使用再加加
j=product(i++)(i++ * i++),这条语句是后置++,i先使用再加加,实际应该是j=product(3)(3*4)=12,应为第二个i++执行完后i=4,第三个后置加加是先使用再
加加所以最后应该是j=3*4=12.
但是注意的是这条语句执行完成后i=5
k=product(++i)(++i * ++i),这条语句是前置加加,先加加再使用,实际传参应该是k=product(6)(7*7)=49
j = product(i++);
宏展开是j = (i++*i++);
;k = product(++i);
宏展开是j = (++i*++i);
。