理论上++i更快,实际与编译器优化有关,通常几乎无差别。
//i++实现代码为:
int operator++(int)
{
int temp = *this;
++*this;
return temp;
}//返回一个int型的对象本身
// ++i实现代码为:
int& operator++()
{
*this += 1;
return *this;
}//返回一个int型的对象引用
简单从返回的值来说,i++返回的是i的值,而++i返回的是i+1的值。
从返回的东西来说,++i返回的是i的引用,i是什么值反映出来就是什么值。可以不停嵌套++(++i)
。而且可以(++i) = 5;
,就是把i的值改为5。可以&(++i)
取i的地址空间。而i++就不行,就会报错,因为i++相当于只是返回一个值,没有实体,就不能这样做,也不能嵌套。
int i = 0;
cout<<++i<<endl<<++i<<endl; //2 2
cout<<++i<<endl<<i++<<endl; //4 2
cout<<i++<<endl<<i++<<endl; //5 4
cout<<i++<<endl<<++i<<endl; //7 8
首先是函数的入栈顺序从右向左入栈的,计算顺序也是从右往左计算的,不过都是计算完以后在进行的压栈操作,所以输出是按顺序的,只是计算顺序是反的:
第一行输出:首先执行++i,返回值是i,这时i的值是1,再次执行++i,返回值是i,得到i=2,将i压入栈中,此时i为2,也就是压入2,2;因为++i返回的是引用,所以前一个的i是2.
第二行输出:首先执行i++,返回值是原来的i,也就是2,再执行++i,返回值是i,依次将2,4压入栈中得到输出结果
第三行:首先执行i++,返回值是原来的4,再执行i++返回值是原来的5,依次将4,5压入栈中得到输出结果
第四行:首先执行++i,返回i,此时i为7,再执行i++,返回值是原来的7,此时i为9,依次将i,8也就是9,8压入栈中,得到输出结果。
理解的时候就是++i是把i压入栈,i是什么值就是什么值。i++是把传入时i的值压入栈,是加之前的值,且不会改的。