首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 中 lvalue 與 rvalue 的正確釋義

     編輯:關於C++

許多中文資料將 lvalue 譯為「左值」、rvalue 譯為「右值」,易誤以為與賦值號左右兩側綁定。實際上,l 代表 location(位址),r 代表 read(可讀值),與左右無關。

標準定義

  • lvalue:具有可定址儲存位置的物件,可出現在賦值運算左側(如變數、解參考指標 *p、陣列元素 a[i])。
  • rvalue:純資料值,無固定儲存位置,只能出現在右側(如字面常數 5、暫時物件、運算結果)。

常數有 rvalue 卻無 lvalue,故 5 = x 非法;const int x 同樣只有 rvalue,不可賦值。

進階範例:超越變數的 lvalue

struct Fun {
    int a;
    int& operator()() { return a; }      // 回傳 lvalue
    int& operator+(const Fun& f) { return a += f.a; } // 回傳 lvalue
    int  operator-(const Fun& f) { return a - f.a; }  // 回傳 rvalue
};

Fun f, g1, g2;
f() = 1;       // 合法:f() 是 lvalue
g1 + g2 = 1;   // 合法:operator+ 回傳 lvalue
g1 - g2 = 1;   // 錯誤:operator- 回傳 rvalue

此例證明 lvalue 本質是「可定址、可修改」,而非「在左邊」。C/C++ 允許運算子多載回傳參考,使表達式成為 lvalue。

關於「左/右值」稱呼

雖然歷史慣稱「左/右值」,且在所有主流語言中賦值目標確實置於左側,但 location/read 解釋更精準涵蓋指標解參考、函式回傳參考等非變數 lvalue。翻譯錯誤源於早期參考書誤譯,並非原理問題。

實務意義

  • 理解編譯器錯誤訊息(lvalue required)。
  • 正確設計運算子多載回傳型別(operator= 回傳 T&、operator+ 回傳 T)。
  • C++11 引入 rvalue reference (T&&) 與移動語意,更需釐清兩者本質差異。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved