**引言:**
**单片机的编程中经常用到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变量
- (二四)内存分配