(+;+;i)和(i+;+;)之间的差异 在C++中,我理解(++)i/代码>应该返回引用 i>代码>,因为需要连接操作符,但我不能理解的是:

(+;+;i)和(i+;+;)之间的差异 在C++中,我理解(++)i/代码>应该返回引用 i>代码>,因为需要连接操作符,但我不能理解的是:,c++,operator-overloading,C++,Operator Overloading,为什么(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++

为什么
(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\u该
只是一个局部变量,在
i++
完成后,对它的引用是毫无意义的。所以逻辑上它应该返回一个右值。

foo
成为某个函数
foo(i++)
使用旧值
i
调用
foo(i)
,并递增
i
,因此需要构建临时副本
foo(++i)
递增
i
,然后用递增的值调用
foo
,因此为了更好的性能,我们可以重用同一个变量,而不需要临时副本。

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

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递增之前的值。这个想法是,如果你想在一个函数中使用i,然后在使用它之后增加值,你可以一步完成。 作为一个例子,这里是我如何重载该运算符的整数

Integer Integer::operator++()
{
    Integer returnValue = *this;
    this->increment();
    return returnValue;
}
所以它增加值,然后返回它以前的值。它也不会返回引用,因为返回的引用与最初传递的引用不同,这会破坏级联

++我 这将增加i的值,然后返回新值。因此,您可以在需要增加i的情况下使用它,然后在函数中使用新值

Integer Integer::operator++(Integer i)
{
    i.increment();
    return i;
}

因此,它返回的值是i的增量值。

,而前缀
++i
返回增量值,后缀
i++
返回旧值并在之后递增。如果您关心CPU周期,则运算符选择非常重要。前缀增量更快;-)

5美分:

由于
i++
复制,非POD变量(即迭代器)的复制速度较慢。如果可能,您应该在任何地方使用
++i


我个人总是对(…;…;++I)使用
而不是(…;…;I++),尽管编译器应该对此进行优化。

除非您讨论的是特定的语言,++I总是返回值,而不是引用。@all:我很确定这是不可知语言的。是否有任何语言可以通过引用返回
i++
?在任何语言的实现中,它必须返回一个新的值。基于问题的上下文,我假设他正在谈论C++中的++操作符重载。澄清一下这个问题会有帮助。@Stephen不,不是。我不理解人们希望在这里一蹴而就地回答问题,而不试图让提问者详细解释他们真正的问题。为什么要匆忙做出假设?@Neil:因为这样做你就有机会赢得一些声誉?
foo(i++)
递增
i
,然后调用
foo
,原始值为
i
。在参数的求值(及其副作用)和函数调用之间有一个序列点。如果必须重载该运算符,了解它们的工作方式很重要。我不会对任何必须使用我的类的人施加++I vs I++的影响。此外,它不能返回对
old
,的引用,因为无法返回对临时变量的引用(或指针)。过于简单的编译器可以创建一个临时变量来存储中间值。对于像
int
这样的标准类型,它不需要任何成本,但是对于例如对象,它可能会很昂贵。如果你的应用程序受CPU限制,这很重要。看见