C grammar 左值 右值和將亡值

2021-10-11 18:38:59 字數 2306 閱讀 2844

在c++03中就有相關的概念

通俗的理解:

(1) 能放在等號左邊的是lvalue

(2) 只能放在等號右邊的是rvalue

(3) lvalue可以作為rvalue使用

對於第三點可以舉個例子:

int x ;

x = 6; //x是左值,6是右值

int y ;

y = 6; //y是左值,6是右值

y = x; //x作為右值,所以左值是可以作為右值使用的

c++11對左值和右值做出了更加詳細的劃分。

表達值分為泛左值、右值;

泛左值分為左值和將亡值(涉及右值引用)

右值可分為純右值和將亡值(涉及右值引用)

左值指定了乙個函式或者物件(表示式計算得出的結果),它是乙個可以取位址的表示式。

也就是說,如果乙個函式或者物件可以取位址,那麼他就是乙個左值。

int lv1

;// object

intmain()

;// lvalue reference to object

int* lv3

;// pointer to object

}int

&lv4()

// function returning lvalue reference

左值例子:

(1) 解引用表示式p

(2) 字串字面量"abc"

(3) 前置自增/自減表示式 ++i / --i

(4) 賦值或復合運算子表示式(x=y或m=n等)

純右值是不和物件相關聯的值(字面量)或者其求值結果是字面量或者乙個匿名的臨時物件.

純右值例子:

(1) 除字串字面量以外的字面量,比如 32, 『a』

(2) 返回非引用型別的函式呼叫 int f()

(3) 後置自增/自減表示式i++/i–

(4) 算術/邏輯/關係表示式(a+b、a&b、a<=b、a(5) 取位址(&x)

如:

72.0f

a–x為乙個整型變數,&x

左值可以當成右值使用

將亡值也指定了乙個物件,是乙個將純右值轉換為右值引用的表示式:

&&這裡不是邏輯與運算子,而是右值引用

int

&& rvr1

;// 右值引用可以引用純右值

我們先來看什麼是左值引用:

a是個左值,b是a的引用,為左值引用。

int a =1;

int& b = a;

如果a是個常量22,我們對其引用就會出錯:

如下:

int

& b;

//錯!非常量左值引用不可引用純右值

為了解決這個問題,可以使用const 引用(常量左值引用)引用純右值:

這樣就能保證22(純右值)不會通過b修改,這樣b就相當於是22的別名。

const

int& b

;

當然還有另一種引用純右值的方法就是右值引用了:

通過右值引用可以使純右值的生存期增加,例如:

int&& rvr1; // 右值引用可以引用純右值

int rv2 =++rv1;

原本22在執行完第乙個語句就會消亡,但是使用右值引用之後,就可以在後面的語句通過呼叫右值引用,繼續使用這個值了。

總例:

int

prv(

int x)

// pure rvalue

intmain()

;// 常量左值引用可引用純右值

int& lvr6

;// 錯!非常量左值引用不可引用純右值

int&& rvr1

;// 右值引用可以引用純右值

int& lvr7

;// 錯!非常量左值引用不可引用純右值

int&& rvr2

;// 右值引用普通函式返回值

rvr1 =

++rvr2;

// 右值引用做左值使用

}

簡介C 11中的左值 純右值 將亡值

在c 11以後,表示式按值類別,可分為3種 另,泛左值 generalized lvalue,glvalue 左值 將亡值 右值 right value,rvalue 純右值 將亡值 以下詳細講解 這裡解釋一下 具名的右值引用是左值 看下面的 void foo x a 這裡 a 是乙個具名的右值引用...

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

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

左值和右值

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