關於i++和i++的左值、右值問題
阿新 • • 發佈:2018-11-18
.com 前綴 const pre 形式 pan bsp log 臨時變量
1、什麽是左值和右值?
左值就是出現在表達式左邊的值(等號左邊),可以被改變,他是存儲數據值的那塊內存的地址,也稱為變量的地址;
右值是指存儲在某內存地址中的數據,也稱為變量的數據。
左值可以作為右值,但右值不可以是左值。
因此也只有左值才能被取地址。
2、舉兩個問題:
int i = 0;
(i++)+=i; //錯誤
(++i)+=i; //正確
int *ip = &(i++); //錯誤
int *ip = &(++i); //正確
3、為什麽i++不能作左值?
我們來看i++和i++的實現就明白了。
// 前綴形式: int& int::operator++() //這裏返回的是一個引用形式,就是說函數返回值也可以作為一個左值使用{//函數本身無參,意味著是在自身空間內增加1的 *this += 1; // 增加 return *this; // 取回值 } //後綴形式: const int int::operator++(int) //函數返回值是一個非左值型的,與前綴形式的差別所在。 {//函數帶參,說明有另外的空間開辟 int oldValue = *this; // 取回值 ++(*this); // 增加 return oldValue; // 返回被取回的值 }
簡單得到理解,就是i++返回的是一個臨時變量,函數返回後不能被尋址得到,它只是一個數據值,而非地址,因此不能作為左值。
更簡單的代碼解釋:
// i++:{ int tmp; tmp=i; i=i+1; return tmp; } // ++i: { i=i+1; return i; }
原文地址:https://www.cnblogs.com/AndyJee/p/4550457.html
關於i++和i++的左值、右值問題