5098|8

2781

帖子

419

TA的资源

五彩晶圆(中级)

楼主
 

【C开发】无限循环 while(1) 和 for(; ;) [复制链接]

无限循环有两种常用的方法:
while(1) 和 for(; ; ) 。
两种方法的效果一样,相比之下,哪种更好些?
编译后代码对比:
1、while( 1 );
00401028 mov eax,10040102D test eax,eax0040102F je main+23h (00401033)00401031 jmp main+18h (00401028)
2、for( ; ; );
00401033 jmp main+23h (00401033)
对比发现,for(; ;)指令少,不占用寄存器,而且没有判断、跳转,比while( 1 )要好一些。
此帖出自编程基础论坛

最新回复

具体编译器具体分析~~~~~~~  详情 回复 发表于 2013-7-14 19:54
点赞 关注
个人签名
 

回复
举报

7815

帖子

57

TA的资源

裸片初长成(中级)

沙发
 
死循环这种事,您一到这,就像遇上几辈子的爱人或者仇人一样,不管如何都将在此死死纠缠……既然如此,你还纠结什么指令效率,运行时间呢?
版主提醒,程序还是很美好的,有很多机制,实际应用的问题要烧脑细胞的,珍惜脑细胞,请不要再纠结这种没几毛钱意义的问题了。
此帖出自编程基础论坛
 
 
 

回复

142

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
死循环天天都碰到啊。windows开机就进入死循环。嵌入式就是在死循环里转。
虽然for比while编译后占用资源小,但是我还是偏向while。因为看到whil(1)比看到for(; ;)更容易理解。while(1)就是一个永真的循环。for(; ;)没有表达任何意义。而且对于for()可以在循环体内修改参数,使for()不是一个永真循环。

[ 本帖最后由 kittka 于 2013-5-9 18:40 编辑 ]
此帖出自编程基础论坛
 
 
 

回复

888

帖子

3

TA的资源

五彩晶圆(初级)

4
 
楼主的分析非常的犀利,很赞同!

这玩意虽然没有几毛钱,但是做为一个开发工程师,了解里面的机制还是非常有用的。

再问楼主,你上面的指令调用是怎么查看对比出来了,介绍一下啊!
此帖出自编程基础论坛
 
个人签名邮箱:ternence.hsu@foxmail.com
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

5
 
这个问题不必纠结了,而且不同的编译器编译出来的可能结果和LZ的不一样;从个人编程风格取舍吧!譬如有的人就喜欢while(1);这样的,因为它直观;而for( ; ; );略显隐晦。
此帖出自编程基础论坛
 
 
 

回复

33

帖子

0

TA的资源

一粒金砂(中级)

6
 
本人比较喜欢while,一来比较直观,二来可以做无穷循环切换。
此帖出自编程基础论坛
 
 
 

回复

888

帖子

3

TA的资源

五彩晶圆(初级)

7
 
刚才对楼主的编译做了一个测试,请楼主对自己编译后的代码是怎么获取到的解释一下。

刚一看,感觉楼主很犀利,实际验证了一下,请楼主对我的现象解释一下!

编译的过程是:预处理,编译,汇编,链接。
在编译这个步骤的时候把程序编译为汇编代码,对while和for的汇编代码进行对比:

源程序while.c
  1. #include
  2. #include

  3. int main(void)
  4. {
  5.         while(1)
  6.         {
  7.                 printf("hello eeworld !\n");
  8.                 sleep(1);
  9.         }
  10.         return 0;
  11. }
复制代码
源程序for.c
  1. #include
  2. #include

  3. int main(void)
  4. {
  5.         for(;;)
  6.         {
  7.                 printf("hello eeworld !\n");
  8.                 sleep(1);
  9.         }
  10.         return 0;
  11. }
复制代码
分别对上面的两个程序进行编译gcc -S while.c;  gcc -S for.c
分别在当期目录下面生成 while.s和for.s

汇编代码如下:
while.s
  1. .file        "while.c"
  2.         .section        .rodata
  3. .LC0:
  4.         .string        "hello eeworld !"
  5.         .text
  6. .globl main
  7.         .type        main, @function
  8. main:
  9.         pushl        %ebp
  10.         movl        %esp, %ebp
  11.         andl        $-16, %esp
  12.         subl        $16, %esp
  13. .L2:
  14.         movl        $.LC0, (%esp)
  15.         call        puts
  16.         movl        $1, (%esp)
  17.         call        sleep
  18.         jmp        .L2
  19.         .size        main, .-main
  20.         .ident        "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"
  21.         .section        .note.GNU-stack,"",@progbits
复制代码
for.s
  1. .file        "for.c"
  2.         .section        .rodata
  3. .LC0:
  4.         .string        "hello eeworld !"
  5.         .text
  6. .globl main
  7.         .type        main, @function
  8. main:
  9.         pushl        %ebp
  10.         movl        %esp, %ebp
  11.         andl        $-16, %esp
  12.         subl        $16, %esp
  13. .L2:
  14.         movl        $.LC0, (%esp)
  15.         call        puts
  16.         movl        $1, (%esp)
  17.         call        sleep
  18.         jmp        .L2
  19.         .size        main, .-main
  20.         .ident        "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"
  21.         .section        .note.GNU-stack,"",@progbits
复制代码
对比两个汇编代码,除了第一行的文件名不同,其他都是一样的,请楼主对这个现象解释一下???
此帖出自编程基础论坛
 
个人签名邮箱:ternence.hsu@foxmail.com
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

8
 
换多几个编译器试试呗~~~~
一个gcc又不能说明什么
在c51下是不一样的,听说。
此帖出自编程基础论坛
 
 
 

回复

135

帖子

0

TA的资源

纯净的硅(初级)

9
 
具体编译器具体分析~~~~~~~
此帖出自编程基础论坛
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表