C中的左值和右值

任何人都可以给我一个关于c中左值和右值的正确解释。 我找不到合适的。 如果有人有链接,请你粘贴t作为评论。

l值是可以获取其地址( 通常例外:寄存器变量 )的实体,它们驻留在内存中的时间足够长,可以通过名称引用。
r值变量对象,其地址不能被采用,并且它们不会在存储器中驻留足够长的时间以便被名称引用,它们是无名的。 通常也称为无名临时对象。

示例程序:

int returnanInteger() { int i = 10; return i; } void doSomething(int i) { //do something, right now we don't care } int main() { int i = 20; doSomething(returnanInteger()); return 0; } 

在上面的程序中, main()中的i是一个l值,因为它的地址可以被取,它可以用名字引用。
而在声明中:

 doSomething(returnanInteger()); 

returnanInteger()返回的值是一个r值 ,它的地址不能被占用,并且它不会在内存中保留足够长的时间以便被nay name引用。它会被立即复制以作为参数传递给函数doSomething()

除了Als上面已经提到过的(足够详细)之外,您可能会发现以下链接很有用:

http://msdn.microsoft.com/en-us/library/bkbs2cds.aspx

左值和右值

基于C ++的链接

右侧的所有值=(“等于”签署c编程)是rvalues.Like x = 23; c =’x’; int * ptr =&x;

这里23,’x’和’&x“是rvalues相应的x,c和* ptr是lvalues。它们代表内存中的变量或对象你永远不能把rvalues放在=的左边(”等于“登录c编程)

有关详细信息,请参阅此链接 – http://www.devx.com/tips/Tip/5696 。 谢谢Softy

简化是将左值视为在程序中具有显式分配的类型“对象”,可以是变量,复合文字或通过malloc或类似机制。 根据它们的类型,左值可以是可修改的(对于类型用const指定),并且可以允许你获取它的地址(用register指定变量声明)。

rvalue只是程序产生的“值”,作为评估的中间步骤,编译器可以自由选择最适合的特定表示。 Rvalues可能不会被修改,通常不会采用他们的地址。 (有非常特殊的情况允许将其用于arrays组件评估。)

lvalues(左值) (通常)位于等式“=”运算符的左侧。

rvalues(右值)位于等式“=”运算符的右侧。

左值是位于内存位置(地址)的对象。 一旦声明它们的块被终止,左值就会被删除。

rvalues是临时值,一旦初始化或分配给左值就会被删除。

例如: int a = 1 + 2;

在上面的例子中,“a”是左值,因为它位于相等运算符的左侧,而表达式“1 + 2”是右值,因为它位于相等运算符的右侧。 执行此语句后,变量“a”(现在初始化为3)将保留在内存中,而表达式“1 + 2”将自动删除。

这是一个链接: https : //msdn.microsoft.com/en-us/library/f90831hc.aspx

L值: “l值”是指标识对象的内存位置。 l值可以显示为赋值运算符的左手侧或右手侧(=)。 l值通常表示为标识符。

涉及可修改位置的表达称为“可修改的l值”。 可修改的l值不能具有数组类型,不完整类型或具有const属性的类型。 对于可修改左值的结构和联合,它们不能具有任何具有const属性的成员。 标识符的名称表示存储位置,而变量的值是存储在该位置的值。

示例:

 // declare a an object of type 'int' int a; // a is an expression referring to an // 'int' object as l-value a = 1; int b = a; // Ok, as l-value can appear on right // Switch the operand around '=' operator 9 = a; // Compilation error: // as assignment is trying to change the // value of assignment operator 

R值: “r值”是指存储在内存中某个地址的数据值.r值是一个表达式,不能赋值给它,这意味着r值可以出现在右边但不是在赋值运算符的左侧(=)。

示例:

 // declare a, b an object of type 'int' int a = 1, b; a + 1 = b; // Error, left expression is // is not variable(a + 1) // declare pointer variable 'p', and 'q' int *p, *q; // *p, *q are lvalue *p = 1; // valid l-value assignment // below is invalid - "p + 2" is not an l-value // p + 2 = 18; q = p + 5; // valid - "p + 5" is an r-value // Below is valid - dereferencing pointer // expression gives an l-value *(p + 2) = 18; p = &b; int arr[20]; // arr[12] is an lvalue; equivalent // to *(arr+12) // Note: arr itself is also an lvalue struct S { int m; }; struct S obj; // obj and obj.m are lvalues // ptr-> is an lvalue; equivalent to (*ptr).m // Note: ptr and *ptr are also lvalues struct S* ptr = &obj; 

在此处输入图像描述