最近准备攻陷力扣,当然也才刚刚开始,准备每50题做一个思想小结。但是最近在做的过程中,发现了一个问题,那就是官方题解常常给的for循环都是++i ,包括其他人的题解,同样用的++i,这里我就很疑惑,难道++i比i++要快吗,不然两种写法我应该在题解中都会看到,但是我看到的几乎都是++i,那么很明显,有问题!
废话不多说,直接开始上干货。
++i与i++的区别
简单来说,我们都知道,++i
是先自增,在运算。而i++
是先运算,在自增。
这里有一个有意思的现象:
#include <iostream>
using namespace std;
int main()
{
int a = 0;
int b = 0;
int *c = &(a++);
int *d = &(++b);
return 0;
}
编译后报错
main.cpp:7:19: error: lvalue required as unary ‘&’ operand
int *c = &(a++);
&的作用于左值,而a++
并非左值,但是++b
的结果是左值。
可简单的理解左值和右值
- 左值:有名对象,可赋值
- 右值,临时对象,不可被赋值
意思就是说a++
是一个右值,或者说“临时对象”,这是为什么呢?
我们可以看一下运算符重载的原理
class Test
{
public:
Test& operator++();//前置自增
const Test operator++(int);//后置自增
private:
int curPos; //当前位置
};
/*前置自增实现范式*/
Test& Test::operator++()
{
++curPos; //自增
return *this; //取值
}
/*后置自增实现范式,为了与前置区分开,多了一个int参数,但从来没用过*/
const Test Test::operator++(int)
{
Test tmp = *this; //取值
++curPos; //自增
return tmp;
}
我们可以看到,后置自增虽然讲curPos的值进行了自增,但是返回的是临时对象,下一次调用时,又是当前时刻curPos的值。
所以在C++中++i是要比i++快的,如果可以的话,编程中尽量使用++i来进行自增操作。
老规矩,有用二连,感谢大家。