幾個術語 資料物件 左值 右值和運算子

2021-10-21 04:41:58 字數 2337 閱讀 2004

在c語言中,類似這樣的語句沒有意義(實際上是無效的):

2002 = bmw

因為在這種情況下,2001被稱為右值(rvalue),只能是字面常量。不能給常量賦值,常量本身就是它的值。因此,在編寫**時要記住,=號左側的必須是乙個變數名。實際上,賦值運算子左側必須引用乙個儲存位置。最簡單的方法就是使用變數名。

幾個屬於:資料物件、左值、右值和運算子

賦值表示式語句的目的是把值儲存到記憶體位置上。用於儲存值的資料儲存區域稱為資料物件(data object)。c標準只有在提到這個概念時才會用到物件這個術語。使用變數名是標識物件的一種方法。除此之外,還有其他方法。例如,可以指定陣列的元素、結構的成員,或者使用指標表示式。左值(lvalue)是c語言的術語,用於標識特定資料物件的名稱或表示式。因此物件指的是實際的資料儲存,而左值是用於標識或定位儲存位置的標籤。

對於早期的c語言,提到左值意味著:

它指定乙個物件,所以引用記憶體中的位址;

它可用在賦值運算子的左側,左值(lvalue)中的l源自left。

但是後來,標準中新增了const限定符。用const建立的變數不可修改。因此,const識別符號滿足上面的第1項,但是不滿足第2項。一方面c繼續把標識物件的表示式定義左值,一方面某些左值卻不能放在賦值運算子的左側。有些左值不能用於賦值運算子的左側。此時,標準對左值的定義已經不能滿足當前的狀況。

為此,c標準新增了乙個術語:可修改的左值(modifiable lvalue),用於標識可修改的物件。所以,賦值運算子的左側應該是可修改的左值。當前標準建議,使用術語物件定位值(object locator value)更好。

右值(rvalue)指的是能賦值給可修改左值的量,且本身不是左值。。例如,考慮下面的語句:

bmw = 2002;

這裡,bmw是可修改的左值,2002是右值。讀者也許猜到了,右值中的r源自right。右值可以是常量、變數或其他可求值的表示式。實際上,當前標準在描述這一概念時使用的是表示式的值(value of an expression),而不是右值。

在學習名稱時,被稱為」項「(如,賦值運算子左側的項)的就是運算物件(operand)。運算物件是運算子操作的物件。

繼續討論:

通過宣告變數來訪問資料物件:

int entity = 3;

該宣告建立了乙個名為entity的識別符號(identifier)。識別符號是乙個名稱,在這種情況下,識別符號可以用來指定(designate)特定物件的內容。識別符號遵循變數的命名規則。在該例中,識別符號entity即是軟體指定硬體記憶體中的物件的方式。該宣告還提供了儲存在物件中的值。

變數名不是指定物件的唯一途徑。考慮下面的宣告:

int *pt = &entity;

int ranks[10];

第一行宣告中,pt是乙個識別符號,它指定了乙個儲存位址的物件。但是,表示式*pt不是識別符號,因為它不是乙個名稱。然而,它確實指定了乙個物件,在這種情況下,它與entity指定的物件相同。一般而言,那些指定物件的表示式被稱為左值。所以,entity既是識別符號也是左值;*pt既是表示式也是左值。按照這個思路,ranks + 2 * entity 既不是識別符號,也不是左值(它不指定記憶體位置上的內容)。但是表示式 *(ranks + 2 * entity)是乙個左值,因為它的確指定了特定記憶體位置的值,即ranks陣列的第7個元素。順帶一提,ranks的宣告建立了乙個可容納10個int型別元素的物件,該陣列的每個元素也是乙個物件。

所有這些示例中,如果可以使用左值改變物件中的值,該左值就是乙個可修改的左值。現在,考慮下面的宣告:

const char *pc = "behold a string literal!";

程式根據該宣告把相應的字串字面值儲存在記憶體中,內含這些字元值的陣列就是乙個物件。由於陣列中的每個字元都能被單獨訪問,所以每個字元也是乙個物件。該宣告還建立了乙個識別符號為pc的物件,儲存著字串的位址。由於可以設定pc重新指向其他字串,所以識別符號pc是乙個可修改的左值。const只能保證被pc指向的字串內容不被修改,但是無法保證pc不能指向別的字串。由於*pc指定了儲存』b』字元的資料物件,所以*pc是乙個左值,但不是乙個可修改的左值。於此類似,因為字串字面值本身指定了儲存字串的物件,所以它也是乙個左值,但不是可修改的左值。

C 術語辨析 左值和右值

c 表示式中不是左值就是右值,所以能理解左值和右值這兩個概念對我們的程式設計還是挺有幫助的。c primer中對左值和右值是這樣描述的 所以從概念中我們可以看出 左值表示式表示的是物件的身份 在記憶體中的位置 右值表示式表示的是物件的值。常見的運算子中返回值的型別 int p decltype p ...

左值和右值,左值引用和右值引用

左值 lvalue 這一術語 於c語言,用來指代那些可以用在賦值表示式左側的東西,具名物件 在棧和堆上分配的物件,或者其他物件的成員,總之就是又確定儲存空間的東西。而術語右值 rvalue 也是源自c語言,指的是只能在賦值表示式右側出現的東西,如字面值和臨時物件。只能繫結到左值,不能繫結到右值的引用...

左值和右值

c c 語言中可以放在賦值符號左邊的變數,即具有對應的可以由使用者訪問的儲存單元,並且能夠由使用者去改變其值的量。或者說左值是代表乙個記憶體位址值,並且通過這個記憶體位址,就可以對記憶體進行讀並且寫 主要是能寫 操作 這也就是為什麼左值可以被賦值的原因了。相對應的還有右值 當乙個符號或者常量放在操作...