前言:for循环里面的i++和++i在平时使用感觉是几乎一样的,但是之前写代码,特别是数据结构课程学链表那会,经常需要做的就是一个节点的next指向什么才结束这样一种情况,当时总是不自觉地将i++调整为++i就能运行成功,这个点比较模糊,查资料才发现存在只有++i可以返回左值这一情况。


    先来一段常规使用:
    image.png
    这个没有相关的差别

    image.png
    一个返回+之前的值一个返回+之后的值,也是字面理解。

    左值:在内存存储空间里面有确定的存储地址的值。 判断是否为左值:看是否允许取地址&运算符获得对应的内存地址。

    ++i可以返回左值,i++不可以。(下面的截图对i++报错,对++i没有报错)
    image.png

    i++和++i的实现:

    1. // 前缀形式:++i
    2. int& int::operator++() //这里返回的是一个引用形式,就是说函数返回值也可以作为一个左值使用
    3. {//函数本身无参,意味着是在自身空间内增加1的
    4. *this += 1; // 增加
    5. return *this; // 取回值
    6. }
    7. //后缀形式:i++
    8. const int int::operator++(int) //函数返回值是一个非左值型的,与前缀形式的差别所在。
    9. {//函数带参,说明有另外的空间开辟
    10. int oldValue = *this; // 取回值
    11. ++(*this); // 增加
    12. return oldValue; // 返回被取回的值
    13. }

    从这个代码也可以看出++i的效率是优于i++的,尽管很微弱。

    :::danger 大多数编译器已经对这两种使用方式封装,使其普通使用的效果几乎一致。 :::

    :::success 今后尽量使用++i,特别是C++写题的时候。 :::

    参考链接: