i++ 與 ++i 的主要區別有兩個:
1、 i++ 返回原來的值,++i 返回加1后的值。
2、 i++ 不能作為左值,而++i 可以。
// 前綴形式:
int& int::operator++() //這里返回的是一個引用形式,就是說函數返回值也可以作為一個左值使用
{//函數本身無參,意味着是在自身空間內增加1的
*this += 1; // 增加
return *this; // 取回值
}
//后綴形式:
const int int::operator++(int) //函數返回值是一個非左值型的,與前綴形式的差別所在。
{//函數帶參,說明有另外的空間開辟
int oldValue = *this; // 取回值
++(*this); // 增加
return oldValue; // 返回被取回的值
}
左值是對應內存中有確定存儲地址的對象的表達式的值,而右值是所有不是左值的表達式的值。
一般來說,左值是可以放到賦值符號左邊的變量。但能否被賦值不是區分左值與右值的依據。比如,C++的const左值是不可賦值的;而作為臨時對象的右值可能允許被賦值。
左值與右值的根本區別在於是否允許取地址&運算符獲得對應的內存地址。
比如:
int i = 0;
int *p1 = &(++i);//正確
int *p2 = &(i++);//錯誤
++i = 1;//正確
i++ = 1;//錯誤