c++程式語言與c語言相比有很多不同之處,而且這些不同的地方有都體現著非常重要的作用。現在我們將會為大家詳細介紹一下有關c++左值與右值之間的一些聯絡,希望能幫助大家對這一語言有乙個深刻的認識。
1. c++左值與右值概念
變數和文字常量都有儲存區,並且有相關的型別,區別在於變數是可定址的;
對於每個變數,都有2個值與其相關聯:
1>資料值,儲存在某個記憶體位址中,也稱右值(rvalue),右值是被讀取的值(read value),文字常量和變數都可被用於右值。
2>位址值,即儲存資料值的那塊記憶體位址,也稱左值(lvalue),文字常量不能被用作左值。
2 . c++左值與右值的相關問題
給表示式加上括號: ++a--
結果 ++(a--)
這個表示式是非法的,因為前增量操作要求乙個可修改的左值,而 "a--" 不是左值(即右值)
3 . c++左值與右值中前增量和後增量的區別
早期的c語言教材,for迴圈語句通常寫成:
for(int i=0;i<10;i++)
而現在多為:
for(int i=0;i<10;++i)
兩者有區別嗎?
a++ 即是返回 a的值,然後變數 a 加 1,返回需要產生乙個臨時變數類似於
++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。
以上就是我們為大家介紹的有關c++左值與右值的相關介紹。
c 左值與右值
在學c 過程中,左值與右值的概念是一道繞不過去的坎,因此就想寫一些自己的理解。左值 lvalue 與右值 rvalue 是c 語法中的術語 terms 第一次看到這兩個詞的時候,很自然就認為在乙個表示式中,在等號左邊的就是左值,在等號右邊的就是右值。如果你們第一次看到這兩個詞也這麼認為的話,那我要恭...
C 左值與右值
左值 lvalue 和右值 rvalue 是 c c 中乙個比較晦澀基礎的概念,不少寫了很久c c 的人甚至沒有聽過這個名字,但這個概念到了 c 11 後卻變得十分重要,它們是理解 move forward 等新語義的基礎。左值與右值這兩概念是從 c 中傳承而來的,在 c 中,左值指的是既能夠出現在...
C 左值與右值
乙個很常見的誤區就是左值時等號左邊的值,右值時等號右邊的值 含義 左值是指表示式結束後依然存在的持久化物件 右值是指表示式結束時就不再存在的臨時物件 左值是儲存單元內的值,即是有實際儲存位址的 右值則不是儲存單元內的值,比如它可能是暫存器內的值也可能是立即數。下圖取自乙個知乎的回答 看幾個例子 in...