1. 程式人生 > >C語言for和while

C語言for和while

for和while的使用,直接舉例子就可以。

一.以VS為例,這裡用的是VS2013;

int i;
fori = 0;i<10;i++)
{
}

int i = 0;
while(i<10)
{
    i++;
}

從程式碼上沒法看到更多的東西,乾脆直接看彙編。

    int i = 0;
008E139E  mov         dword ptr [i],0  
    for (;i<10;i++)
008E13A5  jmp         main+30h (08E13B0h)  
008E13A7  mov         eax,dword ptr [i]  
008E13
AA add eax,1 008E13AD mov dword ptr [i],eax 008E13B0 cmp dword ptr [i],0Ah 008E13B4 jge main+38h (08E13B8h) { } 008E13B6 jmp main+27h (08E13A7h) return 0; 008E13B8 xor eax,eax

    int j = 0;
001D17AE  mov         dword ptr [j],0  

    while (j<10
) 001D17B5 cmp dword ptr [j],0Ah 001D17B9 jge main+36h (01D17C6h) { j++; 001D17BB mov eax,dword ptr [j] 001D17BE add eax,1 001D17C1 mov dword ptr [j],eax } 001D17C4 jmp main+25h (01D17B5h) return 0; 001D17C6 xor eax,eax
    1.這裡的彙編程式碼都是比較簡單的,很明顯我們在DEBUG下生成的彙編中,
也就執行一次,所以是幾乎沒時間差。

    2.對VS進行了設定,查看了一下release下的彙編指令,發現個DEBUG下
    產生的一毛一樣,並沒有什麼優化。

二.以GCC_4.8.2測試

5       int i = 0;
   0x080483f6 <+6>: movl   $0x0,-0x4(%ebp)

6       for(;i<10;i++)
=> 0x080483fd <+13>:    jmp    0x8048403 <main+19>
   0x080483ff <+15>:    addl   $0x1,-0x4(%ebp)
   0x08048403 <+19>:    cmpl   $0x9,-0x4(%ebp)
   0x08048407 <+23>:    jle    0x80483ff <main+15>

7       {
8       }
9   
10      return 0;
   0x08048409 <+25>:    mov    $0x0,%eax
5       int i = 0;
=> 0x080483f6 <+6>: movl   $0x0,-0x4(%ebp)

6       while(i<10)
   0x080483fd <+13>:    jmp    0x8048403 <main+19>
   0x08048403 <+19>:    cmpl   $0x9,-0x4(%ebp)
   0x08048407 <+23>:    jle    0x80483ff <main+15>

7       {
8           i++;
   0x080483ff <+15>:    addl   $0x1,-0x4(%ebp)

9       }
10  
11      return 0;
   0x08048409 <+25>:    mov    $0x0,%eax
    這裡直接用gcc不加任何優化產生的彙編,很明顯,在gcc編譯器下,
    for和while沒有任何差別。較VS相比,可能gcc自己預設的-O0優化產生的差異。
同樣這兩個也是我們經常討論的。

2.1 在VS環境下,彙編上while就比for多了個給暫存器傳值並測試指令(對1傳給暫存器並測試
暫存器空不空),所以論迴圈的話,同樣沒差別。

2.2在gcc環境下,兩者產生的彙編程式碼一毛一樣(就迴圈彙編,不包括其他彙編),沒差別。

所以,在我們考慮選用for還是while的時候,除了根據自身需求之外,再就是編譯器的選擇了。

for(;;)
{
}

while(1)
{
}