前言:for循环里面的i++和++i在平时使用感觉是几乎一样的,但是之前写代码,特别是数据结构课程学链表那会,经常需要做的就是一个节点的next指向什么才结束这样一种情况,当时总是不自觉地将i++调整为++i就能运行成功,这个点比较模糊,查资料才发现存在只有++i可以返回左值这一情况。
先来一段常规使用:
这个没有相关的差别
一个返回+之前的值一个返回+之后的值,也是字面理解。
左值:在内存存储空间里面有确定的存储地址的值。 判断是否为左值:看是否允许取地址&运算符获得对应的内存地址。
++i可以返回左值,i++不可以。(下面的截图对i++报错,对++i没有报错)
i++和++i的实现:
// 前缀形式:++i
int& int::operator++() //这里返回的是一个引用形式,就是说函数返回值也可以作为一个左值使用
{//函数本身无参,意味着是在自身空间内增加1的
*this += 1; // 增加
return *this; // 取回值
}
//后缀形式:i++
const int int::operator++(int) //函数返回值是一个非左值型的,与前缀形式的差别所在。
{//函数带参,说明有另外的空间开辟
int oldValue = *this; // 取回值
++(*this); // 增加
return oldValue; // 返回被取回的值
}
从这个代码也可以看出++i的效率是优于i++的,尽管很微弱。
:::danger 大多数编译器已经对这两种使用方式封装,使其普通使用的效果几乎一致。 :::
:::success 今后尽量使用++i,特别是C++写题的时候。 :::
参考链接: