C 中的左值與右值

2021-06-16 18:07:43 字數 914 閱讀 3183

1. c++左值與右值概念

變數和文字常量都有儲存區,並且有相關的型別,區別在於變數是可定址的;

對於每個變數,都有2個值與其相關聯:

1>資料值,儲存在某個記憶體位址中,也稱右值(rvalue),右值是被讀取的值(read value),文字常量和變數都可被用於右值。

2>位址值,即儲存資料值的那塊記憶體位址,也稱左值(lvalue),文字常量不能被用作左值。

2.c++左值與右值的含義與誤區

c++ 03 標準上是這樣寫的: 「每乙個表示式要麼是乙個 lvalue,要麼就是乙個 rvalue。」

記住,lvalue和rvalue是針對表示式而言的。

lvalue 是指那些單一表示式結束之後依然存在的持久物件。例如: obj,*ptr, prt[index], ++x 都是 lvalue。

rvalue 是指那些表示式結束時(在分號處)就不復存在了的臨時物件。例如:常量, x + y , std::string("meow") , 和 x++ 都是 rvalue。

++x 和 x++ 的區別的語義上的區別: 當寫 int i = 10 ; 時, i 是乙個 lvalue,它實際代表乙個記憶體裡的位址,是持久的。 表示式 ++x 也是乙個 lvalue,它修改了 x 的值,但還是代表原來那個持久物件。但是,表示式 i++ 卻是乙個 rvalue,它只是拷貝乙份i的初值,再修改i的值,最後返回那份臨時的拷貝,那份拷貝是臨時物件。 ++i 和 i++ 都遞增i,但 ++i 返回i本身,而 i++ 返回臨時拷貝。這就是為什麼 ++i 之所以是乙個 lvalue,而 i++ 是乙個 rvalue。

lvalue 與 rvalue 之分不在於表示式做了什麼,而在於表示式代表了什麼(持久物件或臨時產物)。判斷乙個表示式是不是 lvalue 的直接方法就是「能不能對表示式取址?」,如果能夠,那就是乙個 lvalue;如果不能,那就是乙個 rvalue。

C 中左值與右值

讓我們先看看一些常見的左值和右值舉例 int var 6 var is a lvalue const int var 6 var is a nonmodifiable lvalue char str hello,world str is a nonmodifiable lvalue hello,wo...

C 中左值與右值

讓我們先看看一些常見的左值和右值舉例 int var 6 var is a lvalue const int var 6 var is a nonmodifiable lvalue char str hello,world str is a nonmodifiable lvalue hello,wo...

c 中的左值與右值

左值 lvalue 和右值 rvalue 是 c c 中乙個比較晦澀基礎的概念,有的人可能甚至沒有聽過,但這個概念到了 c 11 後卻變得十分重要,它們是理解 move,forward 等新語義的基礎。左值與右值這兩概念是從 c 中傳承而來的,在 c 中,左值指的是既能夠出現在等號左邊也能出現在等號...