下面的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循环相同的输出。我遗漏了什么吗?
当前回答
i++和++i都是在每次执行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循环在语义上等价于
int i = 0;
while(i < 5) {
printf("%d", i);
i++;
}
and
int i = 0;
while(i < 5) {
printf("%d", i);
++i;
}
注意i++;我+ +;从这段代码的角度来看,有相同的语义。它们对i的值有相同的影响(加1),因此对这些循环的行为有相同的影响。
注意,如果将循环重写为,则会有不同
int i = 0;
int j = i;
while(j < 5) {
printf("%d", i);
j = ++i;
}
int i = 0;
int j = i;
while(j < 5) {
printf("%d", i);
j = i++;
}
这是因为在第一个代码块中,j在增量之后看到了i的值(i是先递增的,或预递增的,因此得名),而在第二个代码块中,j在增量之前看到了i的值。
如果你这样写,那就很重要了:
for(i=0; i<5; i=j++) {
printf("%d",i);
}
将比这样写的情况多迭代一次:
for(i=0; i<5; i=++j) {
printf("%d",i);
}
for构造中的第三条语句只被执行,但它的求值被丢弃而不被处理。 当评估值被丢弃时,前后增量相等。 只有当它们的价值被取走时,它们才会有所不同。