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]  
008E13AA  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)
{
}

猜你喜欢

转载自blog.csdn.net/Jorgain/article/details/81873586