任何人都可以给我一个关于c中左值和右值的正确解释。我找不到合适的。如果有人有链接,请将t粘贴为评论。
答案 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(详细说明)之外,您可能会发现以下链接很有用:
答案 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;