下面的for循环产生相同的结果,尽管一个使用后增量,另一个使用前增量。
代码如下:
for(i=0; i<5; i++) {
printf("%d", i);
}
for(i=0; i<5; ++i) {
printf("%d", i);
}
我得到了两个for循环相同的输出。我遗漏了什么吗?
下面的for循环产生相同的结果,尽管一个使用后增量,另一个使用前增量。
代码如下:
for(i=0; i<5; i++) {
printf("%d", i);
}
for(i=0; i<5; ++i) {
printf("%d", i);
}
我得到了两个for循环相同的输出。我遗漏了什么吗?
当前回答
如果你这样写,那就很重要了:
for(i=0; i<5; i=j++) {
printf("%d",i);
}
将比这样写的情况多迭代一次:
for(i=0; i<5; i=++j) {
printf("%d",i);
}
其他回答
如果你这样写,那就很重要了:
for(i=0; i<5; i=j++) {
printf("%d",i);
}
将比这样写的情况多迭代一次:
for(i=0; i<5; i=++j) {
printf("%d",i);
}
i++和++i都是在每次执行printf("%d", i)之后执行的,所以没有区别。
你可以在这里阅读谷歌的答案: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Preincrement_and_Predecrement
重点是,对于简单对象没有区别,但是对于迭代器和其他模板对象你应该使用预增量。
编辑:
这两者没有区别,因为您使用的是简单类型,所以没有副作用,而后增量或前增量在循环体之后执行,所以对循环体中的值没有影响。
你可以用这样一个循环检查它:
for (int i = 0; i < 5; cout << "we still not incremented here: " << i << endl, i++)
{
cout << "inside loop body: " << i << endl;
}
编译器翻译
for (a; b; c)
{
...
}
to
a;
while(b)
{
...
end:
c;
}
所以在你的情况下(后/前增量),这并不重要。
EDIT: continue被goto end取代;
因为在任何一种情况下,增量都是在循环体之后完成的,因此不会影响循环的任何计算。如果编译器是愚蠢的,使用后增量可能会稍微降低效率(因为通常它需要保留一个预值的副本以供以后使用),但我希望在这种情况下优化消除任何差异。
考虑for循环是如何实现的可能会很方便,本质上是转换为一组赋值、测试和分支指令。在伪代码中,预增量看起来像这样:
set i = 0
test: if i >= 5 goto done
call printf,"%d",i
set i = i + 1
goto test
done: nop
后增量至少会有另一个步骤,但它将是微不足道的优化
set i = 0
test: if i >= 5 goto done
call printf,"%d",i
set j = i // store value of i for later increment
set i = j + 1 // oops, we're incrementing right-away
goto test
done: nop