c++中++i和i++的区别

Saturday, June 6, 2020

1. 计算顺序不同

i++ 返回 i 本身,然后将 i 加一

++ii 加一,然后返回 i

int i = 0;
std::cout << i++ << " " << i;
std::cout << std::endl;
std::cout << ++i << " " << i;

output:

0 1
2 2

2. 返回值性质不同

i++ 返回右值,++i 返回左值(百度百科关于左值和右值的词条

所以 i++ = 3 编译器会报错, ++i = 3 则没有问题

3. 运算符重载和效率差别

我们定义一个简单(简陋)的类,包含保存坐标x和y,并且重载前置和后置递增运算符

class Coordinate {
 private:
    int x_;
    int y_;

 public:
    //构造函数
    explicit Coordinate(int x = 0, int y = 0) : x_(x), y_(y){};
    
    //打印x和y
    void printXY() const {
        std::cout << x_ << "," << y_ << std::endl; 
    }
    
    //重载前置递增
    Coordinate operator++() {
        this->x_ += 1;
        this->y_ += 1;
        return *this;
    }
    
    //重载后置递增
    Coordinate operator++(int) {
        Coordinate old = *this;
        this->x_ += 1;
        this->y_ += 1;
        return old;
    }
};

对比前置和后置递增的实现,可以看到为了实现后置递增的语义,我们需要一个额外的变量(old)保存对象原本的值,也就是说对于 Coordinate 类的一个对象 co 来说,理论上 ++co 的效率要高于 co++ 。其实对于C++内置类型来说这一点也是一样的,但现代编译器都会做优化,因此对于整型 i 来说 ++ii++效率上很可能没什么区别

测试一下刚才写的类:

int main(int argc, char **argv) {
    Coordinate co1, co2;

    co2 = ++co1;
    co2.printXY();
    co1.printXY();

    std::cout << std::endl;

    co2 = co1++;
    co2.printXY();
    co1.printXY();

    return 0;
}

output:

1,1
1,1

1,1
2,2

参考:

cpp

使用STL生成随机数

非递归遍历二叉树