(++ i)和(i ++)之间的区别

时间:2010-06-18 19:09:25

标签: c++ operator-overloading

在C ++中我理解(++i)应该返回对i的引用,因为需要连接运算符,但我无法弄清楚:

为什么(i++)应按值返回i

任何人都可以澄清。

8 个答案:

答案 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)

如果您遇到重要的情况,那就错了。

相关问题