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物件等都是左值。從本質上理解,建立和銷毀由編譯器幕後控制,程式設計師只能確保在本行 有效的,就是右值 包括立即數 而使用者建立的,通過作用域規則可知其生存...