需要左值

时间:2010-10-09 08:48:56

标签: c lvalue

“Lvalue required”的错误信息实际意味着什么?

5 个答案:

答案 0 :(得分:8)

左值可以出现在作业的左侧,换句话说就是“可以指定的东西”

所以,找一个左手边不是“可分配”的作业,例如,这样简单的东西可能会触发这样的错误

if (0 = foo)
{

}

这里你试图分配一个常量因为意外使用=而不是==

另见

答案 1 :(得分:6)

这意味着实现需要一个对象,但您只是传递了一个值或函数。对于传递非左值的赋值或应用于非函数的操作地址,会发生这种情况。

左值代表“位置值”,表示引用声明为register或内存位置的对象的表达式。像42这样的值是既不匹配标准的值。更正式地说,有三个类别

  • Lvalues:参考物体。这包括声明为const的对象。这是不可修改的左值。
  • 功能代号:参考功能。 printf是一个功能代号,但&printf不是,而*&printf则是。{/ li>
  • 其他:有时称为“rvalue”,并被标准描述为“表达的价值”。示例是var + 0(产生与对象无关的值)或枚举的枚举器。 &printf属于此类别。

答案 2 :(得分:2)

C99标准规定(6.3.2.1):


lvalue是一个具有对象类型或不完整类型的表达式,而不是void;如果lvalue在评估对象时未指定对象,则行为未定义。当一个对象被称为具有特定类型时,该类型由用于指定该对象的lvalue指定。可修改的lvaluelvalue,它没有数组类型,没有不完整的类型,没有const限定类型,如果它是结构或联合,则没有成员(包括,递归地,所有包含的聚合或联合的任何成员或元素)具有const限定类型。

名称lvalue最初来自作业表达式E1 = E2,其中左操作数E1必须是(可修改的)lvalue。它可能更好地被视为表示对象“定位器值”。有时被称为rvalue的内容在本国际标准中被描述为“表达的价值”。


换句话说,lvalue是您可以找到的可能发生变化的东西。可修改的lvalue是您实际上允许更改的内容。

例如,C语句:

x = 7;

有效,因为xlvalue。另一方面,声明:

14 = 7;

无效,因为14 您可以为作业找到的内容。

摘录:

const int x = 7;

实际上会创建一个名为lvalue的{​​{1}},即使您不允许更改它(它不是可修改的`左值)。

答案 3 :(得分:0)

如果您编写类似function(parameter) = value;的内容,则会出现错误,因为您无法将值分配给任何不适合它的容器。

答案 4 :(得分:0)

很可能这意味着您尝试将值分配给无法分配的内容。例如,以下两种情况都可能导致该错误:

5 = 5; myObject-> myMethod()= 5;