程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++ 左值 和 右值,左值右值

c++ 左值 和 右值,左值右值

編輯:C++入門知識

c++ 左值 和 右值,左值右值


什麼是lvalue, 什麼是rvalue?

lvalue: 具有存儲性質的對象,即lvalue對象,是指要實際占用內存空間、有內存地址的那些實體對象,例如:變量(variables)、函數、函數指針等。

rvalue:相比較於lvalue就是所謂的沒有存儲性質的對象, 也就是臨時對象。

 

也可以這樣理解: 

lvalue: 通過它能夠找到內存中存放的變量(location value),位於賦值運算符左,可以賦值。
rvalue:存放在lvalue對應的內存中的東西(register value), 位於賦值運算符左,不可賦值。

 

對左值和右值的一個最常見的誤解是:等號左邊的就是左值,等號右邊的就是右值。左值和右值都是針對表達式而言的,左值是指表達式結束後依然存在的持久對象,右值是指表達式結束時就不再存在的臨時對象.

 例如:

int a = 10;  
int b = 20;  
int *pFlag = &a;  
vector<int> vctTemp;  
vctTemp.push_back(1);  
string str1 = "hello ";  
string str2 = "world";  
const int &m = 1;  

請問,a,b, a+b, a++, ++a, pFlag, *pFlag, vctTemp[0], 100, string("hello"), str1, str1+str2, m分別是左值還是右值?、

  • a和b都是持久對象(可以對其取地址),是左值;
  • a+b是臨時對象(不可以對其取地址),是右值;
  • a++是先取出持久對象a的一份拷貝,再使持久對象a的值加1,最後返回那份拷貝,而那份拷貝是臨時對象(不可以對其取地址),故其是右值;
  • ++a則是使持久對象a的值加1,並返回那個持久對象a本身(可以對其取地址),故其是左值;
  • pFlag和*pFlag都是持久對象(可以對其取地址),是左值;
  • vctTemp[0]調用了重載的[]操作符,而[]操作符返回的是一個int &,為持久對象(可以對其取地址),是左值;
  • 100和string("hello")是臨時對象(不可以對其取地址),是右值;
  • str1是持久對象(可以對其取地址),是左值;
  • str1+str2是調用了+操作符,而+操作符返回的是一個string(不可以對其取地址),故其為右值;
  •  m是一個常量引用,引用到一個右值,但引用本身是一個持久對象(可以對其取地址),為左值。

 

再例如:

int a = 5;

 

變量a的存儲空間是 &a (a的lvalue), 存儲空間&a上的值為5(a的rvalue).

再看一個例子:

int* p = NULL;  
p = new int(5); 

對於p:  lvalue為&p(p的地址), rvalue為&p地址上的值.

對於*p: lvalue為p(*p的地址),rvalue為p地址上的值.

 有了這些,對於  左值引用就比較好理解了.

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved