for(;;)和 while(1) 有什么区别吗?

void main(void)
{
int a = ;
// for(;;)
while()
{
a++;
}
}
arm-linux-gcc -c -o for.o for.c;
arm-linux-ld -o for_elf for.o;
arm-linux-objcopy -O binary -S for_elf for.bin;
arm-linux-objdump -D -m arm for_elf > for.dis;
cat for.dis

00008460 <main>: //for(;;);
8460: e1a0c00d mov ip, sp
8464: e92dd800 stmdb sp!, {fp, ip, lr, pc}
8468: e24cb004 sub fp, ip, #4 ; 0x4
846c: eafffffe b 846c <main+0xc>

00008074 <main>://while(1);
8074: e1a0c00d mov ip, sp
8078: e92dd800 stmdb sp!, {fp, ip, lr, pc}
807c: e24cb004 sub fp, ip, #4 ; 0x4
8080: eafffffe b

没发现区别所在。

00008074 <main>://while(1){a++}
8074: e1a0c00d mov ip, sp
8078: e92dd800 stmdb sp!, {fp, ip, lr, pc}
807c: e24cb004 sub fp, ip, #4 ; 0x4
8080: e24dd004 sub sp, sp, #4 ; 0x4
8084: e3a03002 mov r3, #2 ; 0x2
8088: e50b3010 str r3, [fp, #-16]
808c: e51b3010 ldr r3, [fp, #-16]
8090: e2833001 add r3, r3, #1 ; 0x1
8094: e50b3010 str r3, [fp, #-16]
8098: eafffffb b 808c <main+0x18>

00008074 <main>://for(;;){a++}
8074: e1a0c00d mov ip, sp
8078: e92dd800 stmdb sp!, {fp, ip, lr, pc}
807c: e24cb004 sub fp, ip, #4 ; 0x4
8080: e24dd004 sub sp, sp, #4 ; 0x4
8084: e3a03002 mov r3, #2 ; 0x2
8088: e50b3010 str r3, [fp, #-16]
808c: e51b3010 ldr r3, [fp, #-16]
8090: e2833001 add r3, r3, #1 ; 0x1
8094: e50b3010 str r3, [fp, #-16]
8098: eafffffb b 808c <main+0x18>

2 为什么用for(;;)或者while(1)

详细阅读http://bbs.csdn.net/topics/80195701中下面一段话后面的内容:

《代码大全》里面说:
    在C 中,只要允许就用for 循环: C 的for 循环是这种语言强有力的结构之一。它不仅
活性强,而且把循环控制代码封装在一起,增加了其可读性。程序员在修改软件时易犯的错误
是;修改了循环前面的初始化循环的代码,但却忘了修改其后面的有关代码。在C 的for 循环
中,所有相关代码集中在循环的顶部,修改起来很容易。如果在C 中能用for 循环替代别的类
型的循环,尽量这样做。

但当while 循环更合适时,别用for 循环。

这个C 中程序虽是for循环却用了while循环的条件头: 

/* read all the records from a file */
for(rewind(InFile).RecCount = ; !feof(InFile); RecCount++)
{
fgets(InputRec[RecCount], MAX_CHARS, InFile);
} C 语言的for 循环比其它语言的for 循环优点在于,它的初始化和结束条件很灵活,而这
种灵活性带来的固有缺点是把控制条件放在了循环头,因而对循环体就无法控制了。
把控制循环的语句放到for 循环头如初始化循环变量、终止循环或转向终止的表达式。上
例中,fgets()语句使循环转向中止,但RecCount 语句却没起到这个作用,它是内部语句,
没有起到控制循环的作用。把RecCount 语句放在循环头而把fgets()语句放在循环体中是一
个错误,它使人误解为是RecCount在控制循环。
这个C 程序较好地用了while循环: 

    /* read all the records from a file */
rewind(InFile);
RecCount = ;
while(!feof(InFile))
{
fgets(InputRec[RecCount], MAX_CHARS, InFile);
RecCount++;
}

最新文章

  1. xamarin android,UWP 网络类型和IP地址
  2. MBP使用笔记
  3. Tomcat服务器8080端口占用报错
  4. hdu 4007 暴力or线段树 ***
  5. Linux常用命令大全(share)
  6. repeat语句
  7. unity, audio falloff
  8. vim 高级使用技巧
  9. linux 定时执行任务 crontab
  10. SQL2008 R2 主从数据库同步设置
  11. BZOJ 1977 次小生成树(最近公共祖先)
  12. git:fatal the current branch master has no upstream branch
  13. OpenVPN客户端证书合并到配置文件中
  14. oracle11g中SQL优化(SQL TUNING)新特性之SQL Plan Management(SPM)
  15. vim 常用 NERDTree 快捷键
  16. 第一个spring简单的helloworld
  17. SSM商城项目(六)
  18. ffmpeg在asp.net 视频转换
  19. Java中递归的优缺点,Java写一个递归遍历目录下面的所有文件包括子文件夹里边的文件。
  20. 源码分析篇 - Android绘制流程(三)requestLayout()与invalidate()流程及Choroegrapher类分析

热门文章

  1. JavaSE学习总结第27天_反射 &amp; 设计模式 &amp; JDK5、7、8新特性
  2. Linux 网络编程: echo Service
  3. poj 2653 计算几何
  4. Select specified items from Tuple List
  5. Tensorflow 神经网络
  6. ACM_HDU 1231 最大连续子序列 (dp)_代码分析
  7. hdoj 1251 统计难题(字典树)
  8. 「OC」 继承
  9. 基础算法-查找:线性索引查找(II)
  10. CSS3 总结-2