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--);没有结束条件
for(;i!=0;i--);i!=0是它的结束条件
他的i是INT ,怎么会没有结束条件。
区别 要看编译器翻译成的汇编是什么样子了
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:两个语句放到最外层循环是没有问题的。
3楼的说法是对的,while放到最后是能够正常延时的,但是为什么while(i--)放到最里面不行呢?
还有,为什么当i=2时,while(i--)会不能正常退出来呢???(这个是最重要的)
请教下 ,我理解while循环的判断条件,不是只判断条件是TRUE还是FALSE吗,也就是条件是1 还是 0?
那么while(i--)为什么会跳不出循环? 而且他的i还是 int类型的
就算i的类型改成unsigned int 类型,也是一样的,只是不知道为什么跳不出循环的
引用: 引用 6 楼 lovewwy 的回复:
请教下 ,我理解while循环的判断条件,不是只判断条件是TRUE还是FALSE吗,也就是条件是1 还是 0?
那么while(i--)为什么会跳不出循环? 而且他的i还是 int类型的
你的while循环是在最内层,即在两个for循环之内.所以,while(i--)跳出的只是内层循环,并没有跳出外层循环。所以还会继续执行外层的循环。外层循环的j还有200次呢,当然不会一下子就退出了。
引用: 引用 8 楼 jiqiang01234 的回复:
引用 6 楼 lovewwy 的回复:
请教下 ,我理解while循环的判断条件,不是只判断条件是TRUE还是FALSE吗,也就是条件是1 还是 0?
那么while(i--)为什么会跳不出循环? 而且他的i还是 int类型的
你的while循环是在最内层,即在两个for循环之内.所以,while(i--)跳出的只是内层循环,并没有跳出外层循环。所以还会继续执行外层的循环。外层循环的j还……
哦,明白了,我没仔细看前面还有FOR ,我以为他说while(i--) 跳不出来了 。
注意:while(i--)中退出的条件是什么?是i--为0,这和--i可不同。也就是说,此时先用i来计算,计算过后i再减1,那么当while(i--)退出后,i就变成了-1,也就是0xffff。当外层的循环再来的时候,这回while(i--)再重新减到0可就需要很长时间了。
引用: 引用 10 楼 jiqiang01234 的回复:
注意:while(i--)中退出的条件是什么?是i--为0,这和--i可不同。也就是说,此时先用i来计算,计算过后i再减1,那么当while(i--)退出后,i就变成了-1,也就是0xffff。当外层的循环再来的时候,这回while(i--)再重新减到0可就需要很长时间了。
大侠说的很对啊,我把下面这个运行了下,i退出时就是-1了。
- #include
- void main()
- {
- int t=0;
- while (t==1);
- {
- cout<
- }
- }
11漏程序贴错了,编辑不了啊。应该是下面这个
- #include
- #include
- int main()
- {
- int i=0xff;
- while(i--) {}
- cout<
- return 0;
- }
- }
引用: 引用 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,其内部的二进制存储差距有一倍之大。
- void delay(int i)
- {
- int j,k,t;
- for(j=0;j<200;j++)
- for(k=0;k<100;k++)
- {
- t=i;
- while(t--);
- }
- }
虽然第二章情况可运行,但延时是不对的
引用: 引用 13 楼 jiqiang01234 的回复:
引用 12 楼 lovewwy 的回复:
11漏程序贴错了,编辑不了啊。应该是下面这个
C/C++ code
#include
#include
int main()
{
int i=0xff;
while(i--) {}
cout<
return 0;
}
}
这里有一点小问题,希望引起注意。……
学习了,谢谢大侠指教
引用: 引用 10 楼 jiqiang01234 的回复:
注意:while(i--)中退出的条件是什么?是i--为0,这和--i可不同。也就是说,此时先用i来计算,计算过后i再减1,那么当while(i--)退出后,i就变成了-1,也就是0xffff。当外层的循环再来的时候,这回while(i--)再重新减到0可就需要很长时间了。
这位朋友的说法很正确哦,谢谢啦
终于搞懂这个问题了。
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--);
// 这些就不一样了。
循环次数一样。
但是跳出循环之后
for:i=0;
while:i=0-1;