(C )關於i 和i 的左值 右值問題

2021-09-08 11:02:14 字數 772 閱讀 8565

1、什麼是左值和右值?

左值就是出現在表示式左邊的值(等號左邊),可以被改變,他是儲存資料值的那塊記憶體的位址,也稱為變數的位址;

右值是指儲存在某記憶體位址中的資料,也稱為變數的資料。

左值可以作為右值,但右值不可以是左值。

因此也只有左值才能被取位址。

2、舉兩個問題:

int i = 0;

(i++)+=i; //錯誤

(++i)+=i; //正確 

int *ip = &(i++); //錯誤

int *ip = &(++i); //正確

3、為什麼i++不能作左值?

我們來看i++和i++的實現就明白了。

// 字首形式:

int& int::operator++() //這裡返回的是乙個引用形式,就是說函式返回值也可以作為乙個左值使用

//字尾形式:

const int int::operator++(int) //函式返回值是乙個非左值型的,與字首形式的差別所在。

簡單得到理解,就是i++返回的是乙個臨時變數,函式返回後不能被定址得到,它只是乙個資料值,而非位址,因此不能作為左值。

更簡單的**解釋:

// i++:

// ++i:

關於i 和 i以及左值,右值

今天無意之間看到了帖子上有人說 i 5 不合法 i 5 合法首先對於i 的實現是 int temp temp i i i 1 return temp 而 i的實現是 i i 1 return i 所以對於我們提出來的問題已經能得到解決了 再囉嗦幾句關於i 和 i的效率問題 按上面分析來說,i的效率是...

i 與 i作為左值

include using namespace std int main i 不可以作為左值 i 可以作為左值。c primer 中關於左值右值的說法 變數和文字常量都有儲存區,並且有相關的型別。區別在於變數是可定址的 addressable 對於每乙個變數都有兩個值與其相聯 1 它的資料值,儲存在...

C 左值和右值,左值引用和右值引用

c 對於左值和右值沒有標準定義,但是有乙個被廣泛認同的說法 可見立即數,函式返回的值等都是右值 而非匿名物件 包括變數 函式返回的引用,const物件等都是左值。從本質上理解,建立和銷毀由編譯器幕後控制,程式設計師只能確保在本行 有效的,就是右值 包括立即數 而使用者建立的,通過作用域規則可知其生存...