自增符号分为前++与后++。对于这两个符号,单独使用时,若变量为内置数据类型,则基本没有区别;若变量为自定义数据类型如STL中,前++的效率要高于后++,因为后++使用时需要一个临时变量保存变量自增前的值,所以STL中关于iterator都是用前++。今天主要讨论一下前、后++与其他运算混合使用时的区别。
先看一下示例代码:
#include <iostream>
using namespace std;
int main()
{
int a=10;
int b=20;
int c=30;
cout<<a<<endl<<(a++)+(a++)<<endl<<a<<endl;
cout<<a<<endl<<endl;
cout<<b<<endl<<(b++)+(++b)<<endl<<b<<endl;
cout<<b<<endl<<endl;
cout<<c<<endl<<(++c)+(++c)<<endl<<c<<endl;
cout<<c<<endl<<endl;
return 0;
}
运行结果为:
在讨论运行结果之前首先要明确一件事情,即cout语句中的运算是从右向左的。
参考http://blog.youkuaiyun.com/keyeagle/article/details/6549771
如第一段输出为12、20、10、12,由第一个值为12而第三个值为10可见打印的第三个a的值并未受到自增的影响,而第一个a的值为自增后的值。由输出的20可以知道,表达式“(a++)+(a++)”先计算出结果后自增的。
再看第二段和第三段输出可以知道,表达式“(b++)+(++b)”中“++b”先使得b的值自增1,然后再计算表达式的值为42(此时式中b的值均为21);而“(++c)+(++c)”中两个“++c”使得c的值此时为32,然后计算整个表达式的值为64。
综上,前++与后++的区别为:
前++:先+1赋值再执行表达式中的其他运算(此时表达式中的同一变量均为增1后的值);
后++:先执行表达式中的其他运算再+1赋值。
补叙:C++重载前置++和后置++
class INT
{
friend ostream& operator<<(ostream& os, const INT& i)
{
os << '[' << i._i << "]";
return os;
}
private:
int _i;
public:
INT(int i) :_i(i) {}
// prefix: increment and then fetch
INT& operator++()
{
++(this->_i);
return *this;
}
// postfix: fetch and then increment
const INT operator++(int)
{
INT tmp = *this;
++(*this);
return tmp;
}
};
int main()
{
INT y = 10;
cout << ++y << endl << y++ << endl;
getchar();
return 0;
}
输出结果:
[12]
[10]