C語言for和while
阿新 • • 發佈:2018-11-20
for和while的使用,直接舉例子就可以。
一.以VS為例,這裡用的是VS2013;
int i;
for(i = 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)
{
}