2012-09-11 52 views
-1

我正在学习C,看到下面在im读的书中列出的第一个循环。我很好奇这两者之间的区别是什么,因为我习惯于使用第二种方法,即使它们返回不同的结果也无法找出差异。这两个FOR循环有什么区别?

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

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

['for'循环后增加和预增加]的可能重复(http://stackoverflow.com/questions/4706199/post-increment-and-pre-increment-in-for-loop) – Joe

+0

循环运行方式没有变化。变化是''我怎么得到增量。'关于'前后增量''google' – tez

回答

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年前的编译器有效,但现在不再有效。

+0

“它会比较慢,比如'int y = i ++;'' - 我没有认为你可以确定这比'int y = ++ i;'慢。我想这可能取决于哪些操作码可用于执行增量操作,但基本上这两个语句都会增加'i',并在增量之前或之后将其值复制到'y'。是否有任何普遍的理由认为在增量之前复制比复制之后复制昂贵? –

+0

@SteveJessop你说得对,即使不是那样,但我确定有些情况确实是后增加速度较慢,但​​与这种情况无关。 –

+0

顺便说一句,当任何一个工作,我更喜欢'++我'为非性能相关的原因。所以我对性能的主张非常感兴趣,以防某些性能问题会破坏我的风格偏好;-) –

0

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

1

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

的唯一的事情是条件,即在第一个要检查高达9和第二的高达10

在这两个循环递增运算使得在这种情况下没有区别

+0

我见过程序员更喜欢++我出于同样的原因 – Cdeez

+0

70岁的程序员使用Turbo C吗? –

+0

只是一个参考:回答[这](http://stackoverflow.com/questions/4706199/post-increment-and-pre-increment-in-for-loop)和评论,回答者张贴(得到6 upvotes太)。所以我认为有些人会像我一样思考。 – Cdeez

1

的前/后增量操作将在你使用它们的同时帮助值。

i=10; 

j = i++; 

这里的i值将是11,但是,的j值将是10。因为i值被分配给j即后增量

i=10; 

j = ++i; 

这里值之后将递增的i将是11,并且j的值也将是11.因为i将在价值被分配给j之前递增e Pre Increment

0

大多数人已经声明迭代次数相差一次,前后增量在这里没有任何区别。

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

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

简而言之,根据我的经验,您会更经常地发现第一个循环,但第二个循环有很多用例。

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