C++中的左值和右值

來源:互聯網
上載者:User
1. 概念
變數和文字常量都有儲存區,並且有相關的類型,區別在於變數是可定址的;

對於每個變數,都有2個值與其相關聯:
1>資料值,儲存在某個記憶體位址中,也稱右值(rvalue),右值是被讀取的值(read value),文字常量和變數都可被用於右值。
2>地址值,即儲存資料值的那塊記憶體位址,也稱左值(lvalue),文字常量不能被用作左值。

2 . 問題
給運算式加上括弧: ++a--
結果 ++(a--)

這個運算式是非法的,因為前增量操作要求一個可修改的左值,而 "a--" 不是左值(即右值)

3 . 前增量和後增量的區別
早期的c語言教材,for迴圈語句通常寫成:
for(int i=0;i<10;i++)
而現在多為:
for(int i=0;i<10;++i)

兩者有區別嗎?

a++ 即是返回 a的值,然後變數 a 加 1,返回需要產生一個臨時變數類似於
{
       int temp = a;
       a=a+1;
       return temp; //返回右值
}

++a 則為:
{
    a=a+1;
    return &a;    //返回左值
}

顯然,前增量不需要中間變數,效率更高。

 另一篇:c++左值與右值的含義與誤區

術語 “L-Values” 和 “R-Values” 是很容易被搞混的,因為它們的曆史淵源也是混淆。他們最初起源是編譯器的設計者,從字面上來理解就是運算式左邊的值和運算式右邊的值。它們的含義一直在演化而名字卻沒變,現在已經“名”不副“實”了。雖然還是稱為left-value 和right-value,但是他們的含義已經大大不同了。

     C++ 03 標準上是這樣寫的: “每一個運算式要麼是一個 lvalue,要麼就是一個 rvalue。”

     記住,lvalue和rvalue是針對錶達式而言的。

      lvalue 是指那些單一運算式結束之後依然存在的持久對象。例如: obj,*ptr, prt[index], ++x 都是      lvalue。

     rvalue 是指那些運算式結束時(在分號處)就不複存在了的臨時對象。例如:1729 , x + y , std::string("meow") , 和 x++ 都是 rvalue。

    ++x 和 x++ 的區別的語義上的區別: 當寫 int i = 10 ; 時, i 是一個 lvalue,它實際代表一個記憶體裡的地址,是持久的。 運算式 ++x 也是一個 lvalue,它修改了 x 的值,但還是代表原來那個持久對象。但是,運算式 i++ 卻是一個 rvalue,它只是拷貝一份i的初值,再修改i的值,最後返回那份臨時的拷貝,那份拷貝是臨時對象。 ++i 和 i++ 都遞增i,但 ++i 返回i本身,而 i++ 返回臨時拷貝。這就是為什麼 ++i 之所以是一個 lvalue,而 i++ 是一個 rvalue。

    lvalue 與 rvalue 之分不在於運算式做了什麼,而在於運算式代表了什麼(持久對象或臨時產物)。 判斷一個運算式是不是 lvalue 的直接方法就是“能不能對錶達式取址?”,如果能夠,那就是一個 lvalue;如果不能,那就是一個 rvalue。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.