for(;;)和 while(1) 有什么区别吗?for()和while()的使用情景。
2014-09-18 09:55
393 查看
1 for(;;)和 while(1) 有什么区别吗?
void main(void) { int a = 2 ; // for(;;) while(1) { 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 = 0; !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 = 0; while(!feof(InFile)) { fgets(InputRec[RecCount], MAX_CHARS, InFile); RecCount++; }
相关文章推荐
- for和while的区别和使用中的优化
- 【Java学习笔记之六】java三种循环(for,while,do......while)的使用方法及区别
- shell脚本中for、while和do的使用以及区别
- java下Class.forName的作用是什么,为什么要使用它(和new对象的区别)
- while(1)和for(;;)两个死循环有什么区别
- for循环和while循环在使用continue时有所区别
- 使用范围for语句和while循环以及传统for的区别
- while和for的使用区别
- Mysql5.1中主要使用的几种表引擎?它们的区别是什么?在使用表引擎时,要注意什么问题?
- DataReader与DataSet有什么区别?何时使用哪种
- HTTP协议中POST、GET、HEAD的区别是什么?分别在什么情况下使用?
- action使用url_for,获取IP地址,setTemplate和redirect的区别
- HTTP协议中POST、GET、HEAD的区别是什么?分别在什么情况下使用?
- libtool的使用 linux下的so、o、lo、a、la文件有什么区别
- 创建String对象时, 使用String s=new String ("abc")和String s="abc"语句有什么区别?
- 求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句
- [ lucene FAQ ] IndexSearcher初始化,IndexSearcher(Directory dir)和IndexSearcher(IndexReader reader)有什么区别?到底使用那个更合理?
- 在共享DLL中使用MFC和在静态库中使用MFC有什么区别
- 什么是抽象类什么是接口两者有什么区别?如何使用它(转载)
- 使用APPlication,Session,Cookie和ViewState等对象保存信息的区别是什么?