c++中的左值跟右值怎麼區分?
c++中的左值跟右值是什麼意思?
區分左值右值的真正說法是:能否用「取地址」運算符獲得對象的內存地址。
對於臨時對象,它可以存儲於寄存器中,所以是沒辦法用「取地址」運算符;
對於常量,它可能被編碼到機器指令的「立即數」中,所以是沒辦法用「取地址」運算符;
這也是C/C++標準的規定。按字面意思,通俗地說。以賦值符號 = 為界,= 左邊的就是左值,= 右邊就是右值。 比如
(1) int b = 3;
(2) int a = b;
第(2)行代碼,a為左值,b為右值。
---------------------
更深一層,可以
將 L-value 的 L, 理解成 Location,表示定位,地址。
將 R-value 的 R 理解成 Read,表示讀取數據。
現在的計算機數據放在內存。內存有兩個很基本的屬性:
- 內存地址。
- 內存裡面放的數據。
想像完全一樣的箱子。每個箱子有個編號,用來區分到底是哪個箱子,箱子裡面可以放東西。內存地址相當於箱子的編號,內存的數據,相當於箱子裡面放的東西。
變數名編譯之後,會映射成內存地址。看看
a = b
的含義。其實就是 將 "b地址內存裡面的數據",放到"a地址內存"中。
用箱子打比方。就是將,b箱子裡面的東西,放到a箱子裡面。真要精確的說,就是b箱子裡面的東西憑空複製一份,放到a箱子中。b箱子裡面的東西還是原來的。
通常
= 左邊表示引用,實質上就是內存地址。
= 右邊表示數據,從內存取的數據,直接給的數據,或者計算出來的數據。
內存地址本身也是數據,也可以放到內存中。相當於C++中說的指針。
因為 = 左邊表示地址,變數映射成地址值,也就 = 左邊不能是常數。因此
a = 3; 是可以的。表示將數據 3 放到a地址內存中。
3 = a; 是沒有意義的。
精確地說,a = b 跟 a = 3 是有微妙的不同。
a = b; 數據從 b地址的內存中取出。
a = 3; 數據直接給出。
-----
說句題外話,有時我們會看到命名縮寫,lhs,rhs。表示"left hand side", "right hand side",以 = 為界。左邊跟右邊。用等號區分是不對的, 左值右值的區分在於表達式代表的是持久對象還是臨時對象例子:
std::string strHello = "Hello World!"
Foo(strHello.substr(0, 5)); //右值引用, substr()返回作為Foo參數是臨時變數,執行結束後就不再存在.
Bar(strHello); //左值引用, strHello在執行結束後依然存在
認真學習Value categories
推薦閱讀:
※語句str2= str1 + (str1.size() - 1," ")為什麼只有1個空格添加進去了?
※C++中類B需要訪問類A的私有成員變數,除了將B聲明為A的友元類外還有其它方法嗎?
※如何在#define里使用"#"?
※繼承模板類為什麼可以用this訪問基類?
※c++模板類拷貝構造函數的問題,有點疑惑?
TAG:C |