现在的位置: 首页 > 综合 > 正文

【C语言天天练(一)】while(1)死循环与for(;;)死循环的区别

2018年05月02日 ⁄ 综合 ⁄ 共 756字 ⁄ 字号 评论关闭

引言:


       单片机的编程中经常用到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

抱歉!评论已关闭.