在C ++中我理解(++i)
应该返回对i
的引用,因为需要连接运算符,但我无法弄清楚:
为什么(i++)
应按值返回i
?
任何人都可以澄清。
答案 0 :(得分:27)
i++
返回一个值,因为它返回旧值i
,而i
则增加1
。
这个的基本实现是:
int i++() {
int old = i;
i = i + 1;
return old;
}
所以,如果它返回了一个引用,它将是错误的值 ...因为i
的值已经增加了!
答案 1 :(得分:19)
++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++
完成后它的引用毫无意义。所以逻辑上它应该返回一个右值。
答案 2 :(得分:4)
让foo
成为某种功能。 foo(i++)
使用旧值foo(i)
调用i
并增加i
,因此需要构建临时副本。 foo(++i)
递增i
,然后使用递增的值调用foo
,因此为了获得更好的性能,我们可以重复使用相同的变量,而不需要临时副本。
答案 3 :(得分:2)
我+ + 这将在i递增之前返回i的值。所以我的想法是,如果你想在一个函数中使用i,然后在使用它之后增加它,你可以一步完成。 举个例子,我将如何为整数重载该运算符。
Integer Integer::operator++()
{
Integer returnValue = *this;
this->increment();
return returnValue;
}
因此它递增值,然后返回它使用的内容。它也不返回引用,因为返回引用将与最初传递的引用不同,这会破坏级联。
++ i的 这会增加i的值,然后返回新值。因此,您可以在需要增加i然后在函数中使用新值的情况下使用它。
Integer Integer::operator++(Integer i)
{
i.increment();
return i;
}
因此它返回的值是i的递增值。
答案 4 :(得分:1)
int i = 0;
Console.Writeline(i++); // Output 0, after that, i will be 1
int x = 0;
Console.Writeline(++x); // Output 1
注意:代码在C#中
答案 5 :(得分:0)
前缀++i
返回递增的值,后缀i++
返回旧值,然后增加它,如果您关心CPU周期,则操作员选择很重要。前缀增量更快; - )
答案 6 :(得分:0)
5美分:
由于i++
制作副本,非POD变量(即迭代器)的速度较慢。您应尽可能在任何地方使用++i
。
我个人总是使用for(...;...;++i)
代替for(...;...;i++)
,尽管compiller应该优化它。
答案 7 :(得分:-4)
如果您遇到重要的情况,那就错了。