左值與右值

2021-07-05 06:02:37 字數 1868 閱讀 7067

左值就是那些能夠出現在賦值符號左邊的東西。

右值就是那些可以出現賦值符號右邊的東西。

例如: 

a = b + 25;

a就是乙個左值,因為它標識了乙個可以儲存結果值的地點,b 

+ 25是個右值,因為它指定了乙個值。但是它們可以互換嗎? b + 25 = a; 原先用作左值的a此時也可以當作右值,

因為每個位置都

包含乙個值。然而,

b + 25不能作為左值,因為它並未標識乙個特定的位置。因此,這條賦值語句是非法的。

注意當計算機計算b + 25時,它的結果必

然儲存於機器的某個地方。但是,

程式設計師並沒有辦法**該結果會儲存在什麼地方,也無法保證這個表示式的值下次還會儲存於那個地方

。其結果是,這個表示式不是一

個左值。基於同樣的理由,字面值常量也都不是左值。

聽上去似乎是變數可以作為左值而表示式不能作為左值,但這個推斷並不準確。在下面的賦值語句中,左值便是乙個表達是式。

int a[30];

...a[b + 10] = 0;

下標引用實際上是乙個操作符,所以表示式的左邊實際上是表示式,但

它卻是乙個合法的左

值,因為它標識乙個特定的位置,我們以後可以在程式中引用它。這裡另外乙個

例子:int a, *pi;

...pi = &a;

*pi = 20;

第2條賦值語句,它左邊的那個值顯然是乙個表示式,但它卻是乙個合法的左值

。為什麼?指標pi的值是

記憶體中某個特定位置的位址,*操作符使機器指向那個位置。當它作為左值使用時,這個表示式指定需要進行修

改的位置。當它作為右值使用時,它就是提取當前儲存於這個位置的值。

指標中的左右值舉例:

char cp = 'a';

char *cp = &ch;

1、&ch 可以作為右值,但是不能作為左值。為什麼這個不是乙個合法的左值?因為&操作符的結果是乙個右值,它不能當作左值使用。當表示式&ch進行求值時,

它的結構

應該儲存於計算機的什麼地方呢?它肯定會位於某個地方,但你無法知道它位於何處。這個表

達式並未標識任何機器記憶體的特定位置,所以它不是乙個合法的

左值。2、cp 可以作為左值,也可以作為右值

3、&cp 可以作為右值,但是不可以作為左值。

4、*cp 可以作為右值,也可以作為左值。

5、*cp + 1 可以作為右值,但是不可以作為左值。*的優先順序高於+,所以首先執行間接訪問操作,我們可以得到它的值。我們取得這個值的乙份拷貝並把它與1相加,表示式的最終結果為字元'b'。這個表示式的最終結果的儲存位置並未清晰定義,所以它不是乙個合法的左值。優先順序**證實+的結構不能作為左值。

6、*(cp + 

1) 可以作為右值,也可以作為左值。

7、++cp 可以作為右值,也可以作為左值。 該表示式返回的是運算元本省(左值),內部實現無臨時變數!!

8、cp+

+ 可以作為右值,但是不可以作為左值。該表示式返回的是乙個運算元的拷貝,內部實現有臨時變數並返回該臨時變數!!由於該臨時變數無所指,故不能賦值。

字尾++操作符同樣增加cp的值,但它先返回cp值的乙份考本然後再增加cp的值。這樣,這個表示式的值就是cp原來的值的乙份拷貝。

9、* ++cp 可以作為右值,也可以作為左值。

10、*cp++ 可以作為右值,也可以作為左值。

11、++*cp 可以作為右值,但是不可以作為左值。 由於這兩個操作符的結合性都是從右向左,所以首先執行的是間接訪問操作,然後,cp所指向的位置的值增加1,表示式的結構是這個增值後的值的乙份拷貝。

12、(*cp) ++ 可以作為右值,但是不可以作為左值。

13、++*++cp 可以作為右值,但是不可以作為左值。

**:

左值與右值

本文摘自 http jiang5005.spaces.live.com blog cns 619f3de8ab99988e 111.entry?action post wa wsignin1.0 8月20日 c 中的左值和右值 1.概念 變數和文字常量都有儲存區,並且有相關的型別,區別在於變數是可定...

左值與右值

對左值和右值的乙個最常見的誤解是 等號左邊的就是左值,等號右邊的就是右值。左值和右值都是針對表示式而言的,左值是指表示式結束後依然存在的持久物件,右值是指表示式結束時就不再存在的臨時物件。乙個區分左值與右值的便捷方法是 看能不能對表示式取位址,如果能,則為左值,否則為右值。下面給出一些例子來進行說明...

左值與右值

int a int b 1 a 5 2 b a 1 這句話是對的 而3 a 1 10 這句話就是錯的呢?關於左值右值的要點 1 變數可以作為左值也可以作為右值 有人會說,3 中的變數a不是可以作為左值嗎?為什麼是錯的。看看第二點。2 在進行表示式求值時,請注意每個操作符需要的運算元是左值還是右值,且...