i++與++i區別
阿新 • • 發佈:2018-12-10
i++與++i主要區別有兩個:
1)i++返回加1前的值,++i返回加1後的值;
2)i++不能作為左值,而++i可以。
注:★左值是對應記憶體中有確定儲存地址的物件的表示式的值,而右值是所有不是左值的表示式的值。(引用自中文維基百科【左值引用】)
★能否被賦值不是區分左值與右值的依據。比如,C++的const左值是不可賦值的;而作為臨時物件的右值可能允許被賦值。左值與右值的根本區別在於是否允許取地址&運算子獲得相應的記憶體地址。
舉個栗子:
1. 是否允許取地址
#include <iostream> using namespace std; int main() { int i = 1; int* p1 = &(++ i); //正確 int* p2 = &(i ++); //錯誤 return 0; }
可見,i++無法取得相應的記憶體地址。
2. 返回值
#include <iostream>
using namespace std;
int main()
{
int i = 1;
++ i = 4; //正確
i++ = 5; //錯誤
return 0;
}
可見,++ i可以作為左值。
為什麼++i可以作為左值,而i++不可以,參見其具體實現:
// 字首形式: int& int::operator++() //這裡返回的是一個引用形式,即函式返回值也可以作為一個左值使用 {//函式本身無參,意味著是在自身空間內增加1的 *this += 1; // 增加 return *this; // 取回值 } //字尾形式: const int int::operator++(int) //函式返回值是一個非左值型的,與字首形式的差別所在。 {//函式帶參,說明有另外的空間開闢 int oldValue = *this; // 取回值 ++(*this); // 增加 return oldValue; // 返回被取回的值 }
注:i++最後返回的是一個臨時變數,而臨時變數是右值。
3. const