小甲鱼C视频 关于预编译那一讲的讨论
本帖最后由 sonusyws 于 2014-6-17 23:51 编辑#include<stdio.h>
#define SQ(y) ((y)*(y))
void main()
{
int i = 1;
while (i <=5 )
{
printf("%d\n",SQ(i++));
}
}以上是第一种方法运行结果如下
第二种方法是
#include<stdio.h>
void main()
{
int i = 1;
int SQ(int y);
while (i<=5)
{
printf("%d\n",SQ(i++));
}
}
int SQ(int y)
{
return ((y)*(y));
}
运行结果如下
代码可以看得懂但是对于预编译还是不明白为什么会这样。。请指教谢谢了
飘过坐等大神帮你解决 本帖最后由 santaclaus 于 2014-6-18 15:38 编辑
#define SQ(y) ((y)*(y))
printf("%d\n",SQ(i++));
第1种,是直接进行宏替换,等价于printf("%d\n", (i++)*(i++)),采用直接替换,无须调用函数,减小开销,所以时间较短。
第1次循环: printf("%d\n",1*1); //先取i(=1)出来,i自增2次,得i=3;
第2次循环: printf("%d\n",3*3); //先取i(=3)出来,i自增2次,得i=5;
第3次循环: printf("%d\n",5*5); //先取i(=5)出来,i自增2次,得i=7;
int SQ(int y)
{
return ((y)*(y));
}
第2种方法是函数调用,等价于printf("%d\n",SQ(i++)),执行过程如下
第1次循环:printf("%d\n",SQ(1)); //结果是1,i自增以后得2
第2次循环:printf("%d\n",SQ(2)); //结果是4,i自增以后得3
第3次循环:printf("%d\n",SQ(3)); //结果是9,i自增以后得4
第4次循环:printf("%d\n",SQ(4)); //结果是16,i自增以后得5
第5次循环:printf("%d\n",SQ(5)); //结果是25,i自增以后得6
另外,有一点奇怪。第1种直接替换,没有函数调用的开销,理论上效率应该更高,但你给的结果却悄悄相反。我也没整明白。是不是数据量大一点就会恢复正常过来呢?
santaclaus说得很对 长知识了,很棒,很有研究性 santaclaus 发表于 2014-6-18 13:31 static/image/common/back.gif
#define SQ(y) ((y)*(y))
printf("%d\n",SQ(i++));
第1种,是直接进行宏替换,等价于printf("%d\n", ...
感谢圣诞老人哈~
其实一开始我关注的是 为什么第一种只有135 第二种是 1,2,3,4,5 根据你的解释是不是说SQ(i++)由于替换的时候有两个i++ 所以i加了两次?
然后你最后说到了 运行的时间问题 我有重新编译运行了一下发现两者时间都差不多在0.08秒 当时截图的时候可能是因为第一次运行 机子反应慢了 另外这都是小程序 可能运行时间差不是很大所以效率看上去差不多 但是我觉得你说的有道理
还有就是 预编译貌似比较快那么我能不能尽量用预编译呢 程序有没有限制的? 在学过了
页:
[1]