標籤:

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 |