[英]Why is there any difference between “++i” and “i++” in a for loop?
[英]Difference between (++i) and (i++)
在C ++中,我理解(++i)
应该返回对i
的引用,因为需要连接运算符,但我无法弄清楚:
为什么(i++)
应该按值返回i
?
任何人都可以澄清一下。
i++
返回一个值,因为它返回i
的旧值,而i
增加1
。
这个的基本实现是:
int i++() {
int old = i;
i = i + 1;
return old;
}
所以,如果它返回一个引用,它将是错误的值 ......因为i
的值已经增加了!
++i
可以写成
prefix_inc (this) {
increase this by 1
return this
}
由于返回了真实的i
,我们可以参考它。 但是, i++
看起来像
postfix_inc (this) {
set old_this = copy of this
increase this by 1
return old_this
}
因为old_this
只是一个局部变量,所以在完成i++
之后它的引用是没有意义的。 所以逻辑上它应该返回一个右值。
让foo
成为一些功能。 foo(i++)
使用旧的i
值调用foo(i)
并递增i
,因此需要构建临时副本。 foo(++i)
递增i
,然后使用递增的值调用foo
,因此为了获得更好的性能,我们可以重用相同的变量,不需要临时副本。
i ++这会在i递增之前返回i的值。 所以我的想法是,如果你想在一个函数中使用i,然后在使用它之后增加它,你可以一步完成。 作为一个例子,这是我如何重置该运算符的整数。
Integer Integer::operator++()
{
Integer returnValue = *this;
this->increment();
return returnValue;
}
to be. 所以它递增值然后返回它是的。 它也不返回引用,因为返回引用将与最初传递的引用不同,这会破坏级联。
++ i这会增加i的值,然后返回新值。 因此,您可以在需要增加i然后在函数中使用新值的情况下使用它。
Integer Integer::operator++(Integer i)
{
i.increment();
return i;
}
所以它返回的值是i的递增值。
int i = 0;
Console.Writeline(i++); // Output 0, after that, i will be 1
int x = 0;
Console.Writeline(++x); // Output 1
注意:代码在C#中
前缀++i
返回递增的值,后缀i++
返回旧值,然后递增,如果您关心CPU周期,则操作员选择很重要。 前缀增量更快;-)
5美分:
由于i++
制作副本,非POD变量(即迭代器)的速度较慢。 你应该尽可能在任何地方使用++i
。
我个人总是使用for(...;...;++i)
而不是for(...;...;i++)
,尽管compiller应该优化它。
如果你曾经处于重要的场景中,那你就错了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.