左值與右值
左值與右值
按字面意思,通俗地說。以賦值符號 = 為界,= 左邊的就是左值,= 右邊就是右值。比如:(1) int b = 3;(2) int a = b;第(2)行代碼,a為左值,b為右值。
更深一層,可以將 L-value 的 L, 理解成 Location,表示定位,地址。將 R-value 的 R 理解成 Read,表示讀取數據。現在的計算機數據放在內存。內存有兩個很基本的屬性:內存地址和內存裡面放的數據。想象完全一樣的箱子。每個箱子有個編號,用來區分到底是哪個箱子,箱子裡面可以放東西。內存地址相當於箱子的編號,內存的數據,相當於箱子裡面放的東西。
變數名編譯之後,會映射成內存地址。看看a = b的含義。其實就是 將 "b地址內存裡面的數據",放到"a地址內存"中。
C/C++語言中可以放在賦值符號左邊的變數,即具有對應的可以由用戶訪問的存儲單元,並且能夠由用戶去改變其值的量。左值表示存儲在計算機內存的對象,而不是常量或計算的結果。或者說左值是代表一個內存地址值,並且通過這個內存地址,就可以對內存進行讀並且寫(主要是能寫)操作;這也就是為什麼左值可以被賦值的原因了。相對應的還有右值:當一個符號或者常量放在操作符右邊的時候,計算機就讀取他們的“右值”,也就是其代表的真實值。簡單來說就是,左值相當於地址值,右值相當於數據值。右值指的是引用了一個存儲在某個內存地址里的數據。
比如: int ia,ib;
ib=0;
ia=ib;
在這裡,首先定義ia,ib。然後對ib賦值,此時計算機取ib的左值,也就是這個符號代表的內存位置即內存地址值,計算機取0的右值,也就是數值0;然後給ia賦值為ib,此時取ib的右值給ia的左值;
所以說,ib的左值、右值是根據他的位置來說的;
這也算是形式語言的一個有意思之處吧。
左值右值翻譯:
L-value中的L指的是Location,表示可定址。Avalue (computer science)that has an address.
R-value中的R指的是Read,表示可讀。in computer science, a value that does not have an address in a computer language.
左值和右值是相對於賦值表達式而言的。左值是能出現在賦值表達式左邊的表達式。左值表達式可以分為可讀寫的左值和只讀左值。右值是可以出現在賦值表達式右邊的表達式,他可以是不佔據內存空間的臨時量或字面量,可以是不具有寫入權的空間實體。如
int a=3;
const int b=5;
a=b+2; //a是左值,b+2是右值
b=a+2; //錯!b是只讀的左值但無寫入權,不能出現在賦值符號左邊
(a=4)+=28; //a=4是左值表達式,28是右值,+=為賦值操作符
34=a+2; //錯!34是字面量不能做左值