C++中++i比i++要快吗?

最近准备攻陷力扣,当然也才刚刚开始,准备每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来进行自增操作。


老规矩,有用二连,感谢大家。

猜你喜欢

转载自blog.csdn.net/suren_jun/article/details/127595685