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

C/C++ 中 lvalue 與 rvalue 的正確釋義:左值非「左」,右值非「右」

     編輯:VC 教學

誤譯源頭:金山詞霸的「左值/右值」

許多中文資料將 lvalue 譯為「左值」,rvalue 譯為「右值」,實則誤導。根據權威定義:

lvalue:l 代表 location (位置/地址)。指擁有可定址儲存空間的表達式,可出現在賦值運算子左側。
rvalue:r 代表 read (讀取)。指僅具資料值、無儲存地址的表達式,只能出現在賦值右側。

核心區別:可定址性


int x;
x = 5;   // OK:x 是 lvalue (有地址),5 是 rvalue (常值)
5 = x;   // Error:5 是常值,無地址,非 lvalue

進階案例:不只是變數

C/C++ 中多種表達式皆為 lvalue,不僅是變數:


int a, *p, arr[10];
struct S { int m; } s;

a;        // lvalue
*p;       // lvalue (解參考指標)
arr[3];   // lvalue (陣列元素)
s.m;      // lvalue (成員)
*p + 1;   // rvalue (指標運算結果無地址)

const 與使用者定義型別的陷阱


const int x = 10;
x = 1;        // Error:x 是 const lvalue,不可修改

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

Fun f, g1, g2;
f() = 1;       // OK:f() 回傳 int&,是 lvalue
g1 + g2 = 1;   // OK:operator+ 回傳 int&,是 lvalue
g1 - g2 = 1;   // Error:operator- 回傳 int,是 rvalue

為何「左/右值」稱呼仍普遍流通?

歷史上賦值語法固定為 lvalue = rvalue,左側必為可定址實體,右側為可讀取值。雖稱呼非精確,但在「賦值語境下」具備直觀性。關鍵在於理解本質:lvalue = 有身份識別的儲存位置,rvalue = 臨時值或純數值。C++11 引入 xvalue (將亡值)、prvalue (純右值) 進一步細化,但核心邏輯不變。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved