for(;i!=0;i--)和while(i--)之间有区别吗??

yfeng129   2010-5-7 20:50 楼主
我今天用软件的方法来延时,延时程序如下:(只看有颜色的部分就可以了)
#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--)有区别吗??(在这里)

回复评论 (28)

while(i--);没有结束条件
for(;i!=0;i--);i!=0是它的结束条件
点赞  2010-5-7 21:56
他的i是INT ,怎么会没有结束条件。
区别 要看编译器翻译成的汇编是什么样子了
点赞  2010-5-7 22:26
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:两个语句放到最外层循环是没有问题的。
点赞  2010-5-7 22:28
纠正一下,i会从0跳到0xFFFF
点赞  2010-5-7 22:43
3楼的说法是对的,while放到最后是能够正常延时的,但是为什么while(i--)放到最里面不行呢?

还有,为什么当i=2时,while(i--)会不能正常退出来呢???(这个是最重要的)
点赞  2010-5-8 00:59
请教下 ,我理解while循环的判断条件,不是只判断条件是TRUE还是FALSE吗,也就是条件是1 还是 0?
那么while(i--)为什么会跳不出循环? 而且他的i还是 int类型的
点赞  2010-5-8 10:23
就算i的类型改成unsigned int 类型,也是一样的,只是不知道为什么跳不出循环的
点赞  2010-5-8 10:52
引用: 引用 6 楼 lovewwy 的回复:
请教下 ,我理解while循环的判断条件,不是只判断条件是TRUE还是FALSE吗,也就是条件是1 还是 0?
那么while(i--)为什么会跳不出循环? 而且他的i还是 int类型的

你的while循环是在最内层,即在两个for循环之内.所以,while(i--)跳出的只是内层循环,并没有跳出外层循环。所以还会继续执行外层的循环。外层循环的j还有200次呢,当然不会一下子就退出了。
点赞  2010-5-8 11:00
引用: 引用 8 楼 jiqiang01234 的回复:
引用 6 楼 lovewwy 的回复:
请教下 ,我理解while循环的判断条件,不是只判断条件是TRUE还是FALSE吗,也就是条件是1 还是 0?
那么while(i--)为什么会跳不出循环? 而且他的i还是 int类型的

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

哦,明白了,我没仔细看前面还有FOR ,我以为他说while(i--) 跳不出来了 。
点赞  2010-5-8 11:03
注意:while(i--)中退出的条件是什么?是i--为0,这和--i可不同。也就是说,此时先用i来计算,计算过后i再减1,那么当while(i--)退出后,i就变成了-1,也就是0xffff。当外层的循环再来的时候,这回while(i--)再重新减到0可就需要很长时间了。
点赞  2010-5-8 11:05
引用: 引用 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. }
点赞  2010-5-8 11:10
11漏程序贴错了,编辑不了啊。应该是下面这个
  1. #include
  2. #include
  3. int main()
  4. {
  5.         int i=0xff;
  6.         while(i--) {}
  7.         cout<
  8.         return 0;
  9. }
  10. }
点赞  2010-5-8 11:12
引用: 引用 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,其内部的二进制存储差距有一倍之大。
点赞  2010-5-8 11:17

  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. }


虽然第二章情况可运行,但延时是不对的
点赞  2010-5-8 11:27
引用: 引用 13 楼 jiqiang01234 的回复:
引用 12 楼 lovewwy 的回复:
11漏程序贴错了,编辑不了啊。应该是下面这个

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

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

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

这位朋友的说法很正确哦,谢谢啦
终于搞懂这个问题了。
点赞  2010-5-8 12:17

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--);
// 这些就不一样了。
点赞  2010-5-8 16:23
再次路过,学习!
点赞  2010-5-8 18:34
循环次数一样。
但是跳出循环之后
for:i=0;
while:i=0-1;
点赞  2010-5-11 16:16
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复