**引言:**
**單片機的編程中經常用到while(1)死循環來進行輪尋操作,但分析Linux內核源代碼時卻經常見到for(;;)作為死循環的條件。**
**兩者區別:**
**區別一**
**for(;;)死循環里的兩個;;代表兩個空語句,編譯器一般會優化掉它們,直接進入循環體。**
**while(1)死循環里的1被看成表達式,每循環一次都要判斷常量1是不是等于零。**
**區別二**
**同樣的代碼,編譯出的程序代碼大小不同。**
**示例分析:**
**for.c源碼:**
~~~
#include <stdio.h>
int main(void)
{
for(;;){
printf("123\n");
}
return 0;
}
~~~
**while.c源碼:**
~~~
#include <stdio.h>
int main(void)
{
while(1){
printf("123\n");
}
return 0;
}
~~~
**匯編上面的兩個程序發現它們的匯編源碼完全相同:**
~~~
.file "while.c"
.section .rodata
.LC0:
.string "123"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
.L2:
movl $.LC0, (%esp)
call puts
jmp .L2
.size main, .-main
.ident "GCC: (Ubuntu 4.4.1-4ubuntu8) 4.4.1"
.section .note.GNU-stack,"",@progbits
~~~
**這樣看來兩者似乎沒有任何區別,其實不然,編譯生成程序的大小不同:**
**-rwxr-xr-x 1 book book 8296 2014-06-12 22:32 for
-rwxr-xr-x 1 book book 8298 2014-06-12 22:33 while**
- 前言
- (四)回調函數
- (一)while(1)死循環與for(;;)死循環的區別
- (二)static關鍵字
- (三)函數
- (四)可變參數函數
- (五)setjmp和longjmp
- (六)指針
- (七)回調函數
- (八)字符串
- (九)動態內存分配
- (十)結構體
- (十一)深入理解指針
- (十二)命令行參數
- (十三)printf、fprintf、sprintf和snprintf函數
- (十四)const關鍵字詳解
- (十五)字符串輸入函數fgets、gets和scanf
- (十六)字符串輸出函數puts、fputs和printf
- (十七)字符/字符串輸出函數fputc、fputs、putc、putchar和puts
- (十八)字符/字符串輸入函數fgetc、fgets、getc、getchar和gets
- (十九)restrict關鍵詞
- (二十)scanf函數詳解
- (二一)內聯函數
- (二二)位操作
- (二三)errno變量
- (二四)內存分配