(+;+;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限制,这很重要。看见