c++中前置++与后置++的区别

  自增(++)与自减(--)是我们经常会用到的运算符,然而很多情况下我们并不注意要用前置还是后置。本文就自增(++),讨论前置++与后置++的不同点,浅析两者的用途(自减运算符同理)。

  1.运算时机不同

  一般情况下在while循环中我们会有如下用法:

while (...) {
    ...
 //++i; i
++; }

  此处无论是前置自增还是后置自增,效果都类似于 i += 1,因为这是单独的运算,没有与其他的表达式参与运算。

  换句话说,如果有其他表达式参与其中,那么运算结果将截然不同。参考以下代码:

    int i = 1;
    int num1 = ++i + 1;
    int j = 1;
    int num2 = j++ + 1;
    cout << num1 << endl;//num1 = 3;
    cout << num2 << endl;//num2 = 2;

  前置运算符之所以叫前置运算符,不是没有道理的。在参与表达式计算中,有前置运算符的效果会先行清算,也就是说,上述代码中的i会先自增然后再+1赋值给num1。即num1 = i(=2) + 1;

  与之对应的,后置运算符的效果则在一行的运算结束后再清算,也就是说j会+1赋值给num2,然后再自增。即num2 = j(=1) + 1;j += 1;

  

  2.运算效率不同

  由于上一条中前置运算符与后置运算符的运算特性,前置运算符返回结果是左值(可以在赋值符号左侧),后置运算符的返回结果是右值(只能出现在赋值符号右侧)。后置运算符为了达到这一效果,必须保存变量未自增前的值,以便于后续返回,因此总体来说后置运算符会有额外的开销,并不等价于 += 1。废话不多说,直接上测试代码:

    size_t n = 1e3;
    clock_t duration = 0;
    clock_t start = 0, finish = 0;
    vector<int> vec(n);
    for (int i = 0; i < n; ++i) {
        start = clock();
        for(auto it = vec.begin(); it != vec.end(); ++it){}
        //for(int i = n; i > 0; --i){}
        finish = clock();
        duration += finish - start;
    }
    cout << "总运行时间为:" << duration << "毫秒" << endl;//前置运算符 381ms
    for (int i = 0; i < n; ++i) {
        start = clock();
        for (auto it = vec.begin(); it != vec.end(); it++) {}
        //for (int i = n; i > 0; i--) {}
        finish = clock();
        duration += finish - start;
    }
    cout << "总运行时间为:" << duration << "毫秒" << endl;//后置运算符 1234ms

  具体运算时间肯定会有一定出入。但是通过以上测试可以明显发现,在遍历中运用自增或者自减时,前置运算会比后置运算快不少。

 

posted @ 2021-02-18 15:22  Takagisan  阅读(1087)  评论(0)    收藏  举报