独闷闷网

 找回密码
 立即注册
搜索
查看: 5617|回复: 1
打印 上一主题 下一主题
收起左侧

[原创] 死循环for(;;)和while(1)完全一样吗?有什么细微区别?哪个更好?已解答。

[复制链接]
跳转到指定楼层
楼主
发表于 2015-1-6 22:50:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 jianhong_wu 于 2015-1-7 00:03 编辑

Inc-东莞:
大家学单片机:都会用到主函数里面的超级循环:while(1),而这个while(1),就是判断括号中的是否为真,1为真,所以一直在此循环.但是,每次循环玩一次,都会先判断一次括号里的1.有什么办法把这个步骤省掉呢?我来推荐一个指令:for(;;)就这样了.有没有人看到奥妙之处?因为for里面根本没有任何判断.

泽坤—江夏:
有啥区别??

Inc-东莞:
所以编译器会把他优化,没有任何判断,直接往死力执行for里面的语句,这才是真正的死循环.

泽坤—江夏:
不用判断,直接循环?


Inc-东莞:
没错,比while(1)减少了每次判断一次的指令.你大可用你手上的单片机实验一下,最好你就是反汇编一下看看就知道了.

蜗牛-重庆:
应该还能跳出吧?

鸿哥-深圳:
for(;;)跟while(1)遇到break的时候都能退出。
伟-肇庆:
while(1)才不会执行逻辑判断.
如while(1);
大家去看他编译生成指令,就是一句简单的原地无条件跳转语句.

鸿哥-深圳:
你不赞成Inc的观点?

伟-肇庆:
不赞成.

鸿哥-深圳:
单独一条while(1);说明不了问题。
如果是
while(1)
{
   ...里面有内容
}
也是无条件跳转指令吗?

伟-肇庆:
是.

Inc-东莞:
汇编并不能说明他不会判断,只能说明编译器优化.

伟-肇庆:
那你就贴上编译生成的汇编说话

Inc-东莞:
好的.如图:

这个是在PC机上的汇编。
我以前跟另外一位群主给争论过。while语句的基本用法,不可能背离C99标准,所以你说的无条件跳转,是不可能的。只能说,编译器给优化了,所以,看没有被优化的就对了。如果像你这样时候,你会发现,你背离了C99了。while语句的用法,如书上所说,参考 c prime plus。

伟-肇庆:
你用keil就不是这样的。在vc我还真没测试过。

Inc-东莞:
那么你的意思是说:while是无条件的了?矛盾了,伟。我上面给图片你看了PC机上的汇编了。这个还有专门的一个帖子讲解。

伟-肇庆:
我之前说的是,while编译器不会每次去判断扩号里面是不是1。、
就例如while(1);他在keil这个死循环,编译生成汇编语句,就是一条无条件跳转语句,还是原地跳转。

Inc-东莞:
你说在keil上,那么IAR呢,IDE呢,甚至其他的编译器都是这样做?我是根据window系统的标准编译器生成的汇编语句,想必你这个不能否定吧?

伟-肇庆:
是,我看了你的汇编,是会判断。我之前在vc,还真没测试过。不过,据我所知,keil,mdk就不是那样处理。

Inc-东莞:
首先抛开编译器。这是c标准。关键字的用法。

伟-肇庆:
行吧,明天再说,我也贴上汇编,我没说while(1)是无条件跳转,是说while(1);,注意,有分号,编译生成是无条件跳转,而且是原地跳转,不会去判断里面的1。在keil和mdk是优化了。

Inc-东莞:
这个不能这样说的,因为我们用的虽然暂时用的可能是这个,但是,这不是编译器说了算的,他不可能背离C标准的,如果你用到PC呢,甚至其他编译器呢?你说的有道理,在keil中我编译了一下,的确是sjmp指令,但是你在PC机或者其他编译器,就不能这样定论了。所以,为什么鬼佬都喜欢用 for(;;)原因就在这了。上了pc,你会发现没有几个人用 while(1)的。

伟-肇庆:
恩恩,是的,我赞成。


乐于分享,勇于质疑!
沙发
发表于 2015-1-6 23:00:36 | 只看该作者
非常好使,测试了,学习
乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2024-11-30 00:34 , Processed in 0.322143 second(s), 19 queries .

快速回复 返回顶部 返回列表