鱼C论坛

 找回密码
 立即注册
查看: 2792|回复: 6

[技术交流] 小甲鱼C视频 关于预编译那一讲的讨论

[复制链接]
发表于 2014-6-17 23:47:06 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 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++));
   }
}
以上是第一种方法  运行结果如下
捕获.PNG

第二种方法是
#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));
}
运行结果如下
2.PNG

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-18 08:46:01 | 显示全部楼层
飘过坐等大神帮你解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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种直接替换,没有函数调用的开销,理论上效率应该更高,但你给的结果却悄悄相反。我也没整明白。是不是数据量大一点就会恢复正常过来呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-18 14:45:06 | 显示全部楼层
santaclaus说得很对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-18 19:25:25 | 显示全部楼层
长知识了,很棒,很有研究性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-6-19 20:53:20 | 显示全部楼层

感谢圣诞老人哈~   
其实一开始我关注的是    为什么第一种只有1  3  5 第二种是 1,2,3,4,5      根据你的解释  是不是说SQ(i++)  由于替换的时候有两个i++   所以i加了两次?     

然后你最后说到了 运行的时间问题   我有重新编译运行了一下  发现两者时间都差不多在0.08秒   当时截图的时候可能是因为第一次运行   机子反应慢了     另外这都是小程序 可能运行时间差不是很大所以效率看上去差不多   但是我觉得你说的有道理      


还有就是    预编译貌似比较快  那么我能不能尽量用预编译呢   程序有没有限制的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-27 15:27:27 | 显示全部楼层
在学过了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 16:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表