今天看一个文章
<想成为嵌入式程序员应知道的0x10个基本问题>
其中有一个十这样写的:
<<<<<<<<<<<<<
4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
这个问题用几个解决方案。我首选的方案是:
while(1)
{
}
一些程序员更喜欢如下方案:
for(;;)
{
}
这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:"我被教着这样做,但从没有想到过为什么。"这会给我留下一个坏印象。
>>>>>>>>>>>>>>>>>>
其实我们一直偏向
for(;;)
{
}这样去写的。
因为直觉这样生成的汇编代码要简洁,为了验证自己想法写了简单的文件测试了下
//test_while.c:
int main()
{
while(1){}
}
//test_for.c:
int main()
{
for(;;){}
}
用cl /FA /c test_while.c test_for.c 命令可以在文件所在目录下生成test_while.asm test_for.asm的文件.
生成文件入下:
; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01
TITLE D:/test_for.c .686P .XMM include listing.inc .model flat
INCLUDELIB LIBCMT INCLUDELIB OLDNAMES
PUBLIC _main ; Function compile flags: /Odtp _TEXT SEGMENT _main PROC ; File d:/test_for.c ; Line 2 push ebp mov ebp, esp $LN2@main: ; Line 3 jmp SHORT $LN2@main ; Line 4 pop ebp ret 0 _main ENDP _TEXT ENDS END
|
; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01
TITLE D:/test_while.c .686P .XMM include listing.inc .model flat
INCLUDELIB LIBCMT INCLUDELIB OLDNAMES
PUBLIC _main ; Function compile flags: /Odtp _TEXT SEGMENT _main PROC ; File d:/test_while.c ; Line 2 push ebp mov ebp, esp $LN2@main: ; Line 3 mov eax, 1 test eax, eax je SHORT $LN3@main jmp SHORT $LN2@main $LN3@main: ; Line 4 pop ebp ret 0 _main ENDP _TEXT ENDS END
|
注意上面asm文件Line 3和Line 4之间的代码,事实证明至少在VS中for生成的代码比while更加简洁。