我正在学习C并在本书中看到了下面列出的第一个循环。我很好奇两者之间的差异,因为我习惯使用第二个,并且无法找出差异,即使它们返回不同的结果。
for(i = 0; i < 10; ++i){}
for(i = 0; i <= 10; i++){}
答案 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
作为数组的索引。第二个循环会导致错误(可能是分段错误)。
你说你习惯了第二个。我不知道为什么你已经习惯了,但是我假设一些其他的编程语言,或者在数学,循环(总结等)中运行到极限的事实(但通常从一开始)。在这种情况下,从零开始的指数可能会略微令人沮丧。
简而言之,根据我的经验,你会更频繁地找到第一个循环,但第二个循环有很多用例。
至于++i
与i++
:我倾向于后者,因为for语句的这一部分发生在循环结束时。因此,后缀表示法更符合逻辑。但再一次,这并不重要。