C++ 为什么要使用++;i而不是i++;如果该值未在语句中的任何其他位置使用?

C++ 为什么要使用++;i而不是i++;如果该值未在语句中的任何其他位置使用?,c++,operators,C++,Operators,我很清楚在C语言中++ int someValue = i++; array[i++] = otherValue; 与之相比有不同的效果 int someValue = ++i; array[++i] = otherValue; 但偶尔我会在for循环中看到前缀为increment的语句,或者只看到它们自己的语句: for( int i = 0; i < count; ++i ) { //do stuff } for(int i=0;i > 也是一个“对象”。(C++不是j

我很清楚在C语言中++

int someValue = i++;
array[i++] = otherValue;
与之相比有不同的效果

int someValue = ++i;
array[++i] = otherValue;
但偶尔我会在for循环中看到前缀为increment的语句,或者只看到它们自己的语句:

for( int i = 0; i < count; ++i ) {
     //do stuff
}
for(int i=0;i

for(int i=0;i

在后两种情况下,
++i
看起来像是试图生成外观漂亮的代码。我在监督什么吗?在后两种情况下,是否有理由使用
++i
而不是
i++
。在重载的postincrement函数中,该函数必须记住对象的上一个值,将其递增,然后返回上一个值。在preincrement函数中,该函数可以简单地递增对象,然后返回对自身的引用(其新值)


对于整数,上述内容可能不适用,因为编译器知道执行增量的上下文,并且在任何情况下都会生成适当的增量代码。

是,出于性能原因。在增量后的情况下,需要在增量之前复制变量i,以便可以返回旧值(即使不使用返回值)。如果是预增量,则不需要此副本。

当您谈论整数等自然类型时,没有什么理由支持预增量而不是后增量。如果不使用返回值,编译器通常能够在这两种情况下生成相同的代码。对于更复杂的类型,如迭代器,情况并非如此。

请在自己的代码中查看两个运算符的可能实现:

// Pre-increment
T*& operator ++() {
    // Perform increment operation.
    return *this;
}

// Post-increment
T operator ++(int) {
    T copy = *this;
    ++*this;
    return copy;
}
后缀操作符调用前缀操作符来执行自己的操作:根据设计,原则上前缀版本总是比后缀版本快,尽管编译器在许多情况下可以对此进行优化(特别是对于内置类型)


因此,对前缀运算符的偏好是自然的;另一个需要解释的是:为什么这么多人对前缀运算符的使用感兴趣,而在不重要的情况下——却没有人对后缀运算符的使用感到惊讶。

正如您所指出的——这与结果无关


此外,在语义上,当使用返回值时,使用预增量通常更清楚地显示测试意图,因此习惯性地使用它比使用后增量更好,以避免意外地测试旧值。

如果我们忽略习惯的力量,“++i”在概念上是一个更简单的操作:它只是在i的值上加一个,然后使用它

另一方面,
i++
是“获取
i
的原始值,将其存储为临时值,将其添加到
i
,然后返回临时值”。它要求我们即使在更新了
i
之后仍保留旧值

康拉德·鲁道夫(Konrad Rudolph)指出,对用户定义的类型使用
i++
,可能会带来性能成本

所以问题是,为什么不总是默认为
++i


如果您没有理由使用'i++',为什么要这样做?为什么您会默认使用推理更复杂、执行速度更慢的操作?

C++常见问题解答Lite对
i++
++i
进行了很好的讨论:

特别是,关于在
for
循环中使用哪种形式,FAQ表达了对
++i
的偏好。以下是文本:

因此,如果您将
i++
作为语句而不是作为 更大的表达式,为什么不直接写
++i
?你永远不会输 任何事情,你有时都会有所收获。旧的C行程序员是
用于编写
i++
而不是
++i
。例如,他们会说,
for(i=0;我的意思是,对于给定的例子,i是int,这是假的,因为它不会带来任何额外的加速?我想补充一点,这只适用于对象。我不认为你可以为int重载+,可以吗?对于脑死的编译器,它可能更快,但任何一个好的编译器都应该能够优化i++ +和++i到相同的序列(至少对于INT)。我只是修改了我的答案,包括:@ Pax:在C++中,当你写代码< int i;<代码> >,代码> > <代码>也是一个“对象”。(C++不是java)。,但对于非平凡迭代器,则切换到预增量。说使用++i是“伪造的”在没有性能差异的情况下,假定i++出于其他原因更可取,这仅仅是一种断言,即您不相信您的同事对C足够了解,可以轻松地阅读其中任何一种。如果人们在剩下的时间里对可读性如此谨慎,我会在我的生活中处理更少的垃圾代码……为什么要使用
i++
而不是
++i
,如果该值在语句中的任何其他地方都没有使用,“试图生成看起来聪明的代码”-这个问题有点反势利?;-)我不认为i++是“更简单的”这怎么可能呢?虽然++i很可能会让你思考,甚至让大多数人思考,但我相信这更多地与你(和他们)对使用它的抵制有关,而不是与运算符本身有关。我将“++i”理解为“增量i”,我真的不明白它似乎给那些很乐意使用三元数的人带来了什么问题?:运算符;-pOr换一种说法,你有
// Pre-increment
T*& operator ++() {
    // Perform increment operation.
    return *this;
}

// Post-increment
T operator ++(int) {
    T copy = *this;
    ++*this;
    return copy;
}