sonusyws 发表于 2014-6-17 23:47:06

小甲鱼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));
}
运行结果如下


代码可以看得懂但是对于预编译还是不明白为什么会这样。。请指教谢谢了

枫叶情 发表于 2014-6-18 08:46:01

飘过坐等大神帮你解决

santaclaus 发表于 2014-6-18 13:31:13

本帖最后由 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种直接替换,没有函数调用的开销,理论上效率应该更高,但你给的结果却悄悄相反。我也没整明白。是不是数据量大一点就会恢复正常过来呢?

theonethatgot 发表于 2014-6-18 14:45:06

santaclaus说得很对

Road_7 发表于 2014-6-18 19:25:25

长知识了,很棒,很有研究性

sonusyws 发表于 2014-6-19 20:53:20

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秒   当时截图的时候可能是因为第一次运行   机子反应慢了   另外这都是小程序 可能运行时间差不是很大所以效率看上去差不多   但是我觉得你说的有道理      


还有就是    预编译貌似比较快那么我能不能尽量用预编译呢   程序有没有限制的?

shehdok 发表于 2014-7-27 15:27:27

在学过了
页: [1]
查看完整版本: 小甲鱼C视频 关于预编译那一讲的讨论