while 和 for 构成的死循环的区别!!

来源:互联网 发布:淘宝香水小样正品店 编辑:程序博客网 时间:2024/05/15 23:53

看VC生成的汇编码,for比while要快一些。for(;;)是直接跳转,while多了两条指令而已。

不过C++标准里并未规定编译器的实现方式,非VC平台以及以后新版的VC二者速度相比如何还未可知。而且说句实话,我蛮讨厌for(;;)代替while(true)的。不直观。我也不在乎这么丁点儿效率。至少我写的程序中没遇到需要优化到这种程度的代码。

 

1. 两种循环在构造死循环时的区别
用while构造死循环时,一般会使用while(TRUE)来构造死循环;而用for来构造死循环时,则使用for(;;)来构造死循环。这两个死循环的区别是:while循环里的条件被看成表达式,因此,当用while构造死循环时,里面的TRUE实际上被看成永远为真的表达式,这种情况容易产生混淆,有些工具软件如PC-Lint就会认为出错了,因此构造死循环时,最好使用for(;;)来进行。
2. 两种循环在普通循环时的区别
对一个数组进行循环时,一般来说,如果每轮循环都是在循环处理完后才讲循环变量增加的话,使用for循环比较方便;如果循环处理的过程中就要将循环变量增加时,则使用while循环比较方便;还有在使用for循环语句时,如果里面的循环条件很长,可以考虑用while循环进行替代,使代码的排版格式好看一些。

=====  网络资料  =======

 

=====  实践  ====

1. 汇编代码 -- 在vc6.0中生成相应语句的汇编代码 DEBUG模式

 //死循环
 for (;;)
 {
  x = 1;
 }

 while (true)
 {
  x = 1;
 }

 // 变量循环
 int y = 0;
 for (int i = 0; i<10; i++)
 {
  y++;
 }
 i =0;
 while (i<10)
 {
  y++;
  i++;
 }

对应的汇编语句为:

 $L270:
; 对于for的真循环,没有判断语句,直接执行for循环体内数据
; x = 1

 mov DWORD PTR _x$[ebp], 1
; for循环执行
 jmp SHORT $L270


$L271:
; 对于while(true)循环,有3条汇编语句来判断
 mov eax, 1
 test eax, eax
 je SHORT $L274
; x = 1
 mov DWORD PTR _x$[ebp], 1
; 无条件跳转到判断语句开始位置
 jmp SHORT $L271

 

$L274:

; 有条件循环开始

; for有条件循环开始 int i = 0
 mov DWORD PTR _i$[ebp], 0
 jmp SHORT $L277

; i自加 i++
$L278:
 mov ecx, DWORD PTR _i$[ebp]
 add ecx, 1
 mov DWORD PTR _i$[ebp], ecx

; 判断条件 i<10
$L277:
 cmp DWORD PTR _i$[ebp], 10   ; 0000000aH
 jge SHORT $L279


; 进行y++操作
 mov edx, DWORD PTR _y$[ebp]
 add edx, 1
 mov DWORD PTR _y$[ebp], edx
; 循环for
 jmp SHORT $L278


$L279:
; 赋i的初值0
 mov DWORD PTR _i$[ebp], 0
$L281:
; 进行条件判断 i<10
 cmp DWORD PTR _i$[ebp], 10   ; 0000000aH
 jge SHORT $L282
; 进行y++操作
 mov eax, DWORD PTR _y$[ebp]
 add eax, 1
 mov DWORD PTR _y$[ebp], eax
; 进行i++操作
 mov ecx, DWORD PTR _i$[ebp]
 add ecx, 1
 mov DWORD PTR _i$[ebp], ecx
; while循环跳转
 jmp SHORT $L281

;由此可以看出,对于需要无条件进行循环的语句,优先采用for语句.

;而在进行变量循环时,for语句在初始化变量后有一条跳转操作,而while没有,这个应该跟vc编译器有关

;可以说应该在效率上没有多大差别,需要进一步进行大数据量操作

;同时,我对于各种语句操作的顺序是否有时间关联不是很清楚.

2. 大批量数据操作实验 -- 自加1000w次,然后再自减1000w次,看执行时间

实践发现对于千万级数据量,执行时间并没有差异

 

总结:

   主要考虑程序的可读性和美观,对于效率问题,可以不用考虑差异性.

   所以我比较推崇,在循环次数确定时,用for,不确定时,用while~~

以上本人转载的网路资料!!转自:http://huanyee.blog.sohu.com/76915823.html

我为什么找while和for死循环的区别呢!!

在看MSP430的例程中,老外好像都用for(;;)死循环,而不用while(1)死循环,所以本人研究了一下,对于普通PC机其实用哪个无关紧要,不差那点效率,while更直观些;但是对于单片机来说,有时还是很必要的!!至于怎么用还看具体情况,我看中国人好像比较习惯用while(1),有没有必要优化成那样,那就 仁者见仁智者见智了!!

源地址:http://blog.renren.com/GetEntry.do?id=479749222&owner=244306723

原创粉丝点击