打印
[技术问题解答]

for和while死循环的区别

[复制链接]
1069|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lovecat2015|  楼主 | 2015-8-28 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一.综述:

大家学单片机,都会用到主函数里面的超级循环:while(1),而这个while(1),就是判断括号中的是否为真,1为真,所以一直在此循环。但是,每次循环完一次,都会先判断一次括号里的1。有什么办法把这个步骤省掉呢?
推荐一个指令:for(;;)就这样了。有没有人看到奥妙之处?因为for里面根本没有任何判断。所以编译器会把它优化,没有任何判断,直接执行for里面的语句,这才是真正的死循环。for(;;)比while(1)减少了每次判断一次的指令。
(几个月前一个我和一个学长讨论过这个问题,他用反汇编给我演示了一次,可惜图片我找不到了。我不会反汇编。)

结果是在PC机(VC反汇编)上的汇编指令是一条直接的MOV跳转指令,而在MDKwhile(1);for(;;)生成的汇编指令都是直接的一条sjmp指令。

如果像是这样
While(1)
{
}

for(;;)
{
}
这样呢?结果是while(1)生成了5行左右的汇编的指令,而for(;;)依旧是一条sjmp指令(MDK环境)。

二:总结
    大家用循环的时候最好用for(;;),生成的代码量还能少一些,这也是一个小细节吧~(就是汇编多了4行代码,如果有强迫症的朋友。。看完之后估计你就会一直用for了)。



相关帖子

沙发
ccw1986| | 2015-8-28 22:07 | 只看该作者
for(;;)和while(1)原来有这么大的区别,以后估计常用for了

使用特权

评论回复
板凳
小帅哥哥| | 2015-9-16 11:17 | 只看该作者
一直用的都是 for 。 除了你说的一点之外还有就是,在一些编译中,用while(1) 会出现警告,说此处一直为真。要知道在程序里如果有地方一直为真会出现警告的 ,有的高级程序员为了程序的可靠性,会设置将警告也当成错误,造成编译不通过。。也是为了避免这类的警告

使用特权

评论回复
地板
淡定致远| | 2015-9-16 16:12 | 只看该作者
楼主果然是行家~

使用特权

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

本版积分规则

80

主题

816

帖子

0

粉丝