打印
[C语言]

关于for循环问题

[复制链接]
4049|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
游浪星|  楼主 | 2013-9-23 08:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在keil C51中 这两个循环有什么区别?
#include<reg51.h>
#define uint unsigned int
sbit Yellow=P2^1;
void main()
{
        unsigned int  i,j;
        while(1)
        {
                Yellow=~Yellow;
                for (i=0;i<32768;i++);
                //for (i=32768;i>0;i--);
        }
}
为什么用第一个for循环时,黄灯闪烁频率明显比第二个小?两个for循环延时的时间不是一样的吗?

相关帖子

沙发
ayb_ice| | 2013-9-23 08:46 | 只看该作者
数学上也是不完全一样的

使用特权

评论回复
板凳
galton1982| | 2013-9-23 08:55 | 只看该作者
减的比加的要快  具体请看汇编

使用特权

评论回复
地板
游浪星|  楼主 | 2013-9-23 09:08 | 只看该作者
ayb_ice 发表于 2013-9-23 08:46
数学上也是不完全一样的

          for (i=0;i<32768;i++);
          for (i=0;i<32767;i++);
那用这两个循环,闪烁频率也相差很多?uint范围是0~65535根本没超过范围呀

使用特权

评论回复
5
游浪星|  楼主 | 2013-9-23 09:10 | 只看该作者
galton1982 发表于 2013-9-23 08:55
减的比加的要快  具体请看汇编

         for (i=0;i<32768;i++);
          for (i=0;i<32767;i++);
那用这两个循环,闪烁频率也相差很多?uint范围是0~65535根本没超过范围呀

使用特权

评论回复
6
sjnh| | 2013-9-23 09:26 | 只看该作者
for (i=0;i<32768;i++),每一次循环要做一次16位减法,然后根据减法结果判断是否满足条件;
for (i=32768;i>0;i--),每一次循环只需将数据装入寄存器A中就知道是不是0了(都是无符号不可能小于0),没必要做减法,指令少很多;
具体看编译后的汇编列表;

使用特权

评论回复
评论
21ID 2013-9-23 22:21 回复TA
知道减法的效率要高,实际应用还是习惯加法呵呵 
NE5532 2013-9-23 09:37 回复TA
楼主倒是给大家提醒了一种优化循环的方法哈~! 
评分
参与人数 4威望 +6 收起 理由
WM~~~ + 1 赞一个!
游浪星 + 1 赞一个!
yueyinji1989 + 2
sxhhhjicbb + 2 很给力!
7
ayb_ice| | 2013-9-23 09:27 | 只看该作者
谁说了,这两个应该一样快,或者差不多呢

道理不很简单吗

假设一个循环相差一个周期,32768个周期下来也不简单啊,何况肯定不止一个周期呢

使用特权

评论回复
8
anjf163| | 2013-9-23 09:36 | 只看该作者
第二个循环快些。编译出来汇编代码短些。6楼解释很清楚了。

使用特权

评论回复
9
dirtwillfly| | 2013-9-23 10:09 | 只看该作者
学习了,理论果真要联系实际才行

使用特权

评论回复
10
tergy2012| | 2013-9-23 11:47 | 只看该作者
循环啊

使用特权

评论回复
11
浪浪云| | 2013-9-23 12:16 | 只看该作者
看了六楼真是长知识了

使用特权

评论回复
12
yu080301021| | 2013-9-23 13:07 | 只看该作者
学习了 顶六楼

使用特权

评论回复
13
solidboy| | 2013-9-23 14:43 | 只看该作者
学到知识了,六楼很厉害的样子

使用特权

评论回复
14
SevenWans| | 2013-9-23 15:09 | 只看该作者
围观6666666666666666666

使用特权

评论回复
15
江枫渔火| | 2013-9-23 16:48 | 只看该作者
围观14楼~

使用特权

评论回复
16
么么沫沫| | 2013-9-23 17:43 | 只看该作者
吼吼,围观中,以前从没想过这个问题。

使用特权

评论回复
17
李冬发| | 2013-9-23 18:10 | 只看该作者
第二个循环效率本身就是高啊,只是很拗口,我一般还是用第一个循环。

使用特权

评论回复
18
haitun1895| | 2013-9-23 18:19 | 只看该作者
还真么有想过这样的问题;  每次都是在keil里面看下时间的;

使用特权

评论回复
19
s200522056| | 2013-9-23 21:45 | 只看该作者
所以还是要用计时器精确计时

使用特权

评论回复
20
symbochang| | 2013-9-23 21:55 | 只看该作者
两者汇编代码量不一样的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

45

帖子

0

粉丝