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,返回需要產生一個臨時變量類似於
- {
- int temp = a;
- aa=a+1;
- return temp; //返回右值
- }
++a 則為:
- {
- aa=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。
以上就是我們為大家介紹的有關C++左值與右值的相關介紹。