10

错误消息“需要左值”实际上是什么意思?

4

5 回答 5

9

左值是可以出现在赋值左侧的东西,换句话说,“可以被赋值的东西”

所以,寻找一个左侧不是“可赋值”的赋值,例如,像这样简单的事情可能会触发这样的错误

if (0 = foo)
{

}

在这里,由于意外使用 = 而不是 ==,您尝试分配给常量

也可以看看

于 2010-10-09T08:51:36.857 回答
6

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

Lvalue 代表“位置值”,表示引用声明为register内存位置或内存位置的对象的表达式。类似的东西42是既不符合条件的值。更正式地有三类

  • Lvalues:引用对象。这包括声明为 const 的对象。这些是不可修改的左值。
  • 功能指示符:指功能。printf是函数指示符,但&printf不是,while*&printf又是。
  • 其他:有时称为“右值”,被标准描述为“表达式的值”。示例是var + 0(产生一个不再与对象关联的值)或枚举的枚举数。&printf属于这一类。
于 2010-10-09T08:55:04.937 回答
2

C99 标准规定 (6.3.2.1):


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

该名称lvalue最初来自赋值表达式E1 = E2,其中左操作数E1必须是 (modifiable) lvalue。将其视为表示对象“定位器值”可能更好。有时rvalue在本国际标准中称为“表达式的值”。


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

例如,C 语句:

x = 7;

是有效的,因为x是一个lvalue. 另一方面,声明:

14 = 7;

无效,因为不是14您可以找到的作业。

片段:

const int x = 7;

即使您不允许更改它,实际上也会创建一个lvalue被调用(它不是可修改的 `lvalue)。x

于 2010-10-09T08:56:13.903 回答
0

如果您编写类似的代码,则会出现错误,function(parameter) = value;因为您无法为任何不可能的容器赋值。

于 2010-10-09T08:55:44.100 回答
0

很可能这意味着您试图为无法分配的东西分配值。例如,以下两种情况都可能导致该错误:

5 = 5; 我的对象->我的方法()= 5;

于 2010-10-09T09:33:38.393 回答