我很清楚在C++中
int someValue = i++; array[i++] = otherValue;
与...相比有不同的效果
int someValue = ++i; array[++i] = otherValue;
但每隔一段时间我就会在for循环中看到带有前缀增量的语句,或者仅仅是它们自己的语句:
for( int i = 0; i < count; ++i ) { //do stuff }
要么
for( int i = 0; i < count; ) { //do some stuff; if( condition ) { ++i; } else { i += 4; } }
在后两种情况下,++i
看起来像是试图生成看起来很聪明的代码.我在监督什么吗?是否有理由使用++i
而不是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 ++',为什么呢?为什么你会默认执行更复杂的操作,并且可能执行速度较慢?
如你所知 - 结果并不重要.
非原始类型存在性能考虑因素.
在使用返回值时,语义上使用预增量通常更清楚地显示测试的意图,因此最好习惯性地使用它而不是后增量以避免意外测试旧值.