C中的左值和右值

时间:2012-05-18 04:45:16

标签: c

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

6 个答案:

答案 0 :(得分:2)

l-values 是可以获取其地址(通常例外:寄存器变量)的实体。它们存在于记忆中的时间足够长,可以用名字来表示 r-values 变量对象,其地址无法获取&它们不会长时间驻留在内存中,不能被名称引用,它们是无名的。通常也称为无名临时对象。

<强> Sample Program:

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;
}

上述i中的main()计划是 l值,因为可以获取其地址,并可以通过名称引用。
而在声明中:

doSomething(returnanInteger());

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

答案 1 :(得分:0)

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

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

LValue&RValue

C++ Based Link

答案 2 :(得分:0)

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

这里23,'x'和'&amp; x'是rvalues 相应地,x,c和* ptr是左值。它们表示存储器中的变量或对象 你永远不能把rvalues放在=的左边(“等于”签到c编程)

有关详细信息,请参阅此链接 - http://www.devx.com/tips/Tip/5696。 RGDS 软质皮

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

左值(左值)(通常)位于等式的左侧&#34; =&#34;操作

rvalues(右值)位于相等的右侧&#34; =&#34;操作

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

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

例:int a = 1 + 2;

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

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

答案 5 :(得分:0)

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值:&#34; 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;

enter image description here