1. 程式人生 > >關於i++和i++的左值、右值問題

關於i++和i++的左值、右值問題

.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+1return tmp; } // ++i: { i=i+1; return i; }

原文地址:https://www.cnblogs.com/AndyJee/p/4550457.html

關於i++和i++的左值、右值問題