7164|28

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

for(;i!=0;i--)和while(i--)之间有区别吗?? [复制链接]

我今天用软件的方法来延时,延时程序如下:(只看有颜色的部分就可以了)
#include
void delay(int i)
{
        int j,k;
                for(j=0;j<200;j++)
                        for(k=0;k<100;k++)
                                //for(;i!=0;i--);
                                while(i--);
}
void main(void)
{       
        while(1)
        {
               
                P2 = 0x0;
                P3 = 0xff;
                P1 = 0xff;
                delay(2);

                P2 = 0xff;
                P3 = 0x0;
                P1 = 0x0;
                delay(2);
        }
}
结果不能正常工作,但是我改为:
#include
void delay(int i)
{
        int j,k;
                for(j=0;j<200;j++)
                        for(k=0;k<100;k++)
                                for(;i!=0;i--);
                                //while(i--);

}
void main(void)
{       
        while(1)
        {
               
                P2 = 0x0;
                P3 = 0xff;
                P1 = 0xff;
                delay(2);

                P2 = 0xff;
                P3 = 0x0;
                P1 = 0x0;
                delay(2);
        }
}
这样写就可以了,我编译的软件是keil,
请问:软件延时的:for(k=0;k<100;k++)和while(i--)有区别吗??(在这里)

最新回复

while(i--)转化成汇编语言程序时,i的值对应延时为2*i个机器周期。  详情 回复 发表于 2010-5-13 11:53
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
while(i--);没有结束条件
for(;i!=0;i--);i!=0是它的结束条件
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
他的i是INT ,怎么会没有结束条件。
区别 要看编译器翻译成的汇编是什么样子了
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
void delay(int i)
{
int j,k;  
for(j=0;j<200;j++)
for(k=0;k<100;k++)
for(;i!=0;i--);
//while(i--);
}
用for(;i!=0;i--);循环,只有k=0时执行一次。
用while(i--);循环,i会从0跳到0xFF,无限循环下去。

PS:两个语句放到最外层循环是没有问题的。
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

5
 
纠正一下,i会从0跳到0xFFFF
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
3楼的说法是对的,while放到最后是能够正常延时的,但是为什么while(i--)放到最里面不行呢?

还有,为什么当i=2时,while(i--)会不能正常退出来呢???(这个是最重要的)
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
请教下 ,我理解while循环的判断条件,不是只判断条件是TRUE还是FALSE吗,也就是条件是1 还是 0?
那么while(i--)为什么会跳不出循环? 而且他的i还是 int类型的
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
就算i的类型改成unsigned int 类型,也是一样的,只是不知道为什么跳不出循环的
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 lovewwy 的回复:
请教下 ,我理解while循环的判断条件,不是只判断条件是TRUE还是FALSE吗,也就是条件是1 还是 0?
那么while(i--)为什么会跳不出循环? 而且他的i还是 int类型的

你的while循环是在最内层,即在两个for循环之内.所以,while(i--)跳出的只是内层循环,并没有跳出外层循环。所以还会继续执行外层的循环。外层循环的j还有200次呢,当然不会一下子就退出了。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 jiqiang01234 的回复:
引用 6 楼 lovewwy 的回复:
请教下 ,我理解while循环的判断条件,不是只判断条件是TRUE还是FALSE吗,也就是条件是1 还是 0?
那么while(i--)为什么会跳不出循环? 而且他的i还是 int类型的

你的while循环是在最内层,即在两个for循环之内.所以,while(i--)跳出的只是内层循环,并没有跳出外层循环。所以还会继续执行外层的循环。外层循环的j还……

哦,明白了,我没仔细看前面还有FOR ,我以为他说while(i--) 跳不出来了 。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

11
 
注意:while(i--)中退出的条件是什么?是i--为0,这和--i可不同。也就是说,此时先用i来计算,计算过后i再减1,那么当while(i--)退出后,i就变成了-1,也就是0xffff。当外层的循环再来的时候,这回while(i--)再重新减到0可就需要很长时间了。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 10 楼 jiqiang01234 的回复:
注意:while(i--)中退出的条件是什么?是i--为0,这和--i可不同。也就是说,此时先用i来计算,计算过后i再减1,那么当while(i--)退出后,i就变成了-1,也就是0xffff。当外层的循环再来的时候,这回while(i--)再重新减到0可就需要很长时间了。
大侠说的很对啊,我把下面这个运行了下,i退出时就是-1了。
  1. #include
  2. void main()
  3. {
  4. int t=0;

  5. while (t==1);
  6. {
  7.         cout<
  8. }
  9. }
复制代码
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

13
 
11漏程序贴错了,编辑不了啊。应该是下面这个
  1. #include
  2. #include
  3. int main()
  4. {
  5.         int i=0xff;
  6.         while(i--) {}
  7.         cout<
  8.         return 0;
  9. }
  10. }
复制代码
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 12 楼 lovewwy 的回复:
11漏程序贴错了,编辑不了啊。应该是下面这个

C/C++ code
#include
#include
int main()
{
    int i=0xff;
    while(i--) {}
    cout<     return 0;
}
}

这里有一点小问题,希望引起注意。是cpu字长的问题,因为51是8位的cpu字长,而现在普通的cpu是32位的。同样是int变量,51只能表示0~0xffff,而在pc上却能表示0xffffffff。因此,同样是-1,其内部的二进制存储差距有一倍之大。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

15
 

  1. void delay(int i)
  2. {
  3. int j,k,t;  
  4. for(j=0;j<200;j++)
  5. for(k=0;k<100;k++)
  6. {
  7.   t=i;
  8.   while(t--);
  9. }
  10. }
复制代码


虽然第二章情况可运行,但延时是不对的
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 13 楼 jiqiang01234 的回复:
引用 12 楼 lovewwy 的回复:
11漏程序贴错了,编辑不了啊。应该是下面这个

C/C++ code
#include
#include
int main()
{
int i=0xff;
while(i--) {}
cout< return 0;
}
}

这里有一点小问题,希望引起注意。……

学习了,谢谢大侠指教
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 10 楼 jiqiang01234 的回复:
注意:while(i--)中退出的条件是什么?是i--为0,这和--i可不同。也就是说,此时先用i来计算,计算过后i再减1,那么当while(i--)退出后,i就变成了-1,也就是0xffff。当外层的循环再来的时候,这回while(i--)再重新减到0可就需要很长时间了。

这位朋友的说法很正确哦,谢谢啦
终于搞懂这个问题了。
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

18
 

for(;i!=0;i--);
while(i--);
---------------
单循环一次是一致的,循环调用必然不一样了。
设i传进来就是0

for(;i!=0;i--);
for(;i!=0;i--);
for(;i!=0;i--);
for(;i!=0;i--);
for(;i!=0;i--);

// 这几次都不执行





















while(i--);
while(i--);
while(i--);
while(i--);
// 这些就不一样了。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

19
 
再次路过,学习!
 
 
 

回复

123

帖子

0

TA的资源

一粒金砂(初级)

20
 
循环次数一样。
但是跳出循环之后
for:i=0;
while:i=0-1;
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表