有讀者提出了類似這樣的問題:while(1) 和 for(;;) 它們不都是無限循環(huán)嗎,作用應(yīng)該一樣啊,它們到底有什么區(qū)別?
要回答這個(gè)問題,其實(shí)你各自編寫一段while(1) 和 for(;;)的代碼,編譯對比一下代碼大小和匯編文件,你就大概知道了。
while(1)和for(;;)語法表達(dá)
這里先說一下while(1)和for(;;)語法表達(dá)式。
1.while語法表達(dá)
while( 表達(dá)式 ){ 語句}
其中:
表達(dá)式:是循環(huán)條件
語句:為循環(huán)體。
while語句的語義是:計(jì)算表達(dá)式的值,當(dāng)值為真(非0)時(shí), 執(zhí)行循環(huán)體語句。其執(zhí)行過程可用下圖表示:
2.for語法表達(dá)
for(表達(dá)式1; 表達(dá)式2; 表達(dá)式3) { 語句}
它的執(zhí)行過程如下:
1.先求解表達(dá)式1
2.求解表達(dá)式2
若其值為真(非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下面第3)步;
若其值為假(0),則結(jié)束循環(huán),轉(zhuǎn)到第5)步。
3.求解表達(dá)式3
4.轉(zhuǎn)回上面第2)步繼續(xù)執(zhí)行。
5.循環(huán)結(jié)束,執(zhí)行for語句下面的一個(gè)語句。
while(1)和for(;;)異同點(diǎn)
這里先說一下結(jié)論,然后再驗(yàn)證驗(yàn)證結(jié)論。
1.相同點(diǎn)作用和效果都一樣:都是實(shí)現(xiàn)無限循環(huán)的功能。
2.不同點(diǎn)while(1):其中括號里面是一個(gè)條件,程序會判斷真假。而括號里面的“1”永遠(yuǎn)是一個(gè)“真值”。
其中,每一次循環(huán),編譯器都要判斷常量1是不是等于零。
for(;;):這兩個(gè);;空語句,編譯器一般會優(yōu)化掉的,直接進(jìn)入死循環(huán)。
根據(jù)上面的描述,你可能會覺得:while(1) 比 for(;;) 要做更多事,匯編代碼更多,代碼量也更大。
但事實(shí)是這樣嗎?下面驗(yàn)證一下。
驗(yàn)證while(1)和for(;;)差異
我們編寫分別兩個(gè)文件for.c和while.c,然后分別生成匯編代碼,看下情況。
1.源代碼while.c:
// filename: while.cint main(int argc, char const *argv[]){ while(1) {}
return 0;}
for.c:
// filename: for.cint main(int argc, char const *argv[]){ for(;;) {}
return 0;}
2.生成匯編我們這里使用gcc編譯器生成匯編,執(zhí)行命令如下:
gcc -S -o while.s while.cgcc -S -o for.s for.c
while匯編代碼:
; filename: whiles .file “while.c” .text .globl main .type main, @functionmain:.LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl %edi, -4(%rbp) movq %rsi, -16(%rbp).L2: jmp .L2 .cfi_endproc.LFE0: .size main, 。-main .ident “GCC: (GNU) 9.3.0” .section .note.GNU-stack,“”,@progbits
for匯編代碼:
; filename: for.s .file “for.c” .text .globl main .type main, @functionmain:.LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl %edi, -4(%rbp) movq %rsi, -16(%rbp).L2: jmp .L2 .cfi_endproc.LFE0: .size main, 。-main .ident “GCC: (GNU) 9.3.0” .section .note.GNU-stack,“”,@progbits
你會發(fā)現(xiàn),除了文件名不同,其余都相同。
當(dāng)然,這里額外說一下,不同代碼、不同編譯器,以及不同優(yōu)化等級,可能最終結(jié)果有所差異。
責(zé)任編輯:haq
-
C語言
+關(guān)注
關(guān)注
180文章
7581瀏覽量
135637 -
編程
+關(guān)注
關(guān)注
88文章
3544瀏覽量
93494 -
代碼
+關(guān)注
關(guān)注
30文章
4700瀏覽量
68111
原文標(biāo)題:while(1) 和 for ( ; ; )有什么區(qū)別?
文章出處:【微信號:pcbgood,微信公眾號:奈因PCB電路板設(shè)計(jì)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論