我正在学习C,看到下面在im读的书中列出的第一个循环。我很好奇这两者之间的区别是什么,因为我习惯于使用第二种方法,即使它们返回不同的结果也无法找出差异。这两个FOR循环有什么区别?
for(i = 0; i < 10; ++i){}
for(i = 0; i <= 10; i++){}
我正在学习C,看到下面在im读的书中列出的第一个循环。我很好奇这两者之间的区别是什么,因为我习惯于使用第二种方法,即使它们返回不同的结果也无法找出差异。这两个FOR循环有什么区别?
for(i = 0; i < 10; ++i){}
for(i = 0; i <= 10; i++){}
第一个迭代到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年前的编译器有效,但现在不再有效。
“它会比较慢,比如'int y = i ++;'' - 我没有认为你可以确定这比'int y = ++ i;'慢。我想这可能取决于哪些操作码可用于执行增量操作,但基本上这两个语句都会增加'i',并在增量之前或之后将其值复制到'y'。是否有任何普遍的理由认为在增量之前复制比复制之后复制昂贵? –
@SteveJessop你说得对,即使不是那样,但我确定有些情况确实是后增加速度较慢,但与这种情况无关。 –
顺便说一句,当任何一个工作,我更喜欢'++我'为非性能相关的原因。所以我对性能的主张非常感兴趣,以防某些性能问题会破坏我的风格偏好;-) –
第一次将运行10次。第二个将运行11次。
的前/后增量操作将在你使用它们的同时帮助值。
说
i=10;
j = i++;
这里的i
值将是11,但是,的j
值将是10。因为i
值被分配给j
即后增量
i=10;
j = ++i;
这里值之后将递增的i
将是11,并且j
的值也将是11.因为i
将在价值被分配给j
之前递增e Pre Increment
大多数人已经声明迭代次数相差一次,前后增量在这里没有任何区别。
对于c,我会说第一个循环是你更常遇到的。我认为这是因为c使用从零开始的数组,因此数组的最大值(或字符串,因为它是一个字符数组)不会用作数组中的索引(这将超出范围)。因此,在本例中,当循环访问长度为10的数组时,第一个循环将更符合逻辑,因为您可以安全地使用i
作为数组的索引。第二个循环会导致错误(可能是分段错误)。
你说你习惯第二个。我不知道你为什么习惯这样做,但我假设一些其他的编程语言,或者在数学中,循环(总和等)运行到极限(但通常从一开始)。在这种情况下,基于零的指数可能会有点令人沮丧。
简而言之,根据我的经验,您会更经常地发现第一个循环,但第二个循环有很多用例。
至于++i
与i++
:我倾向于后者,因为for语句的这部分发生在循环的结尾。后缀表示法因此更合乎逻辑。但再一次,这并不重要。
['for'循环后增加和预增加]的可能重复(http://stackoverflow.com/questions/4706199/post-increment-and-pre-increment-in-for-loop) – Joe
循环运行方式没有变化。变化是''我怎么得到增量。'关于'前后增量''google' – tez