这两个FOR循环之间有什么区别?

时间:2012-09-11 09:25:24

标签: c

我正在学习C并在本书中看到了下面列出的第一个循环。我很好奇两者之间的差异,因为我习惯使用第二个,并且无法找出差异,即使它们返回不同的结果。

for(i = 0; i < 10; ++i){}

for(i = 0; i <= 10; i++){}

5 个答案:

答案 0 :(得分:6)

第一个迭代到9,第二个迭代到10。就是这样。

前/后增量操作没有区别。

为两个版本生成的未优化代码:

    for(int i = 0; i < 10; ++i)
00E517AE  mov         dword ptr [i],0  
00E517B5  jmp         wmain+30h (0E517C0h)  
00E517B7  mov         eax,dword ptr [i]  
00E517BA  add         eax,1  
00E517BD  mov         dword ptr [i],eax  
00E517C0  cmp         dword ptr [i],0Ah  
00E517C4  jge         wmain+53h (0E517E3h)  
    {
    }

    for(int i = 0; i <= 10; i++)
00E517E3  mov         dword ptr [i],0  
00E517EA  jmp         wmain+65h (0E517F5h)  
00E517EC  mov         eax,dword ptr [i]  
00E517EF  add         eax,1  
00E517F2  mov         dword ptr [i],eax  
00E517F5  cmp         dword ptr [i],0Ah  
00E517F9  jg          wmain+88h (0E51818h)  
    {
    }

所以,即使在这里,也没有性能损失。 i++++i慢的事实是不正确的(至少在这种情况下,它没有什么区别)。它会慢一点,比如int y = i++,但在这种情况下,两者会做不同的事情,这不是这里的情况。性能问题可能在20年前的编译器中有效,但现在不再存在。

答案 1 :(得分:1)

在第一个中你有预增量,第二个有一个后增量。

唯一的条件就是条件,即第一个检查到9个,第二个检查到10个。

在两个循环中,增量运算符在这种情况下没有区别

答案 2 :(得分:1)

当您在分配值时使用它们时,前/后增量操作将起作用。

i=10;

j = i++;

此处i的值将为11,但j的值将为10.因为i将在将值分配给j后增加,即后增量

i=10;

j = ++i;

此处i的值将为11,j的值也将为11.因为i将在将值分配给j之前递增,即预增量

答案 3 :(得分:0)

第一个将运行10次。第二个将运行11次。

答案 4 :(得分:0)

大多数人已经说过,迭代次数相差1,而且前后增量在这里没有任何区别。

对于c,我会说第一个循环是你更常见的。我认为原因是c使用从零开始的数组,因此数组的最大值(或字符串,因为它是一个字符数组)不会被用作数组中的索引(这将超出范围)。因此,在此示例中循​​环遍历长度为10的数组时,第一个循环将是更合乎逻辑的循环,因为您可以安全地使用i作为数组的索引。第二个循环会导致错误(可能是分段错误)。

你说你习惯了第二个。我不知道为什么你已经习惯了,但是我假设一些其他的编程语言,或者在数学,循环(总结等)中运行到极限的事实(但通常从一开始)。在这种情况下,从零开始的指数可能会略微令人沮丧。

简而言之,根据我的经验,你会更频繁地找到第一个循环,但第二个循环有很多用例。

至于++ii++:我倾向于后者,因为for语句的这一部分发生在循环结束时。因此,后缀表示法更符合逻辑。但再一次,这并不重要。