谁能给我关于c中的左值和右值的正确解释。我还没有找到合适的。如果有人有链接,你可以粘贴 t 作为评论。
6 回答
l 值是可以获取地址(通常例外:寄存器变量)的实体,它们驻留在内存中的时间足够长,可以通过名称引用。
r-values是变量对象,其地址无法获取,并且它们驻留在内存中的时间不足以被名称引用,它们是无名的。通常也称为无名临时对象。
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
中,inmain()
是一个左值,因为它的地址可以被获取并且可以通过名称来引用。
同时,在声明中:
doSomething(returnanInteger());
返回的值returnanInteger()
是一个r-value,它的地址不能被获取,它在内存中的保留时间不够长,不能被任何名称引用。它会立即被复制以作为参数传递给函数doSomething()
。
= 右侧的所有值(在 c 编程中“等于”符号)都是右值。就像 x = 23; c = 'x'; int *ptr = &x;
这里 23 , 'x' 和 '&x" 是右值 对应的 x , c 和 *ptr 是左值。它们代表内存中的变量或对象 你永远不能把右值放在 = ("equal" to登录 c 编程)
请参阅此链接 - http://www.devx.com/tips/Tip/5696 了解更多信息。rgds 软软的
一种简化是将左值视为在程序中具有显式分配的类型化“对象”,可以是变量、复合文字或通过malloc
或类似机制。根据它们的类型,左值可以修改或不可修改(const
为类型指定),并且您可能被允许获取或不获取它的地址(register
为变量声明指定)。
右值只是程序作为评估中的中间步骤生成的“值”,编译器可以自由选择最适合的特定表示。右值不能被修改,它们的地址通常不能被取走。(有非常特殊的情况允许将其用于数组组件评估。)
除了上面 Als 已经提到的(足够详细)之外,您可能会发现以下链接很有用:
左值(左值)(通常)位于等式“=”运算符的左侧。
右值(右值)位于等式“=”运算符的右侧。
左值是位于内存位置(地址)的对象。一旦声明它们的块被终止,左值就会被删除。
右值是临时值,一旦它们被初始化或分配给左值就会被删除。
前任:int a = 1 + 2;
在上面的示例中,“a”是左值,因为它位于等式运算符的左侧,而表达式“1 + 2”是右值,因为它位于等式运算符的右侧。一旦这个语句被执行,变量“a”(现在被初始化为 3)在内存中持续存在,而表达式“1 + 2”被自动删除。
这是一个链接:https ://msdn.microsoft.com/en-us/library/f90831hc.aspx
L-value: “l-value”是指识别对象的内存位置。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-value : “r-value”是指存储在内存中某个地址的数据值。r-value 是一个表达式,不能为其分配值,这意味着 r-value 可以出现在右侧,但不能出现在右侧在赋值运算符 (=) 的左侧。
例子 :
// 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;