for(;;)和 while(1) 有什么區別嗎?for()和while()的使用情景。


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++;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM