2010-10-09 68 views
9

错误信息“Lvalue required required”究竟是什么意思?需要左值

+0

可能重复[“需要l值”错误](http://stackoverflow.com/questions/1353384/l-value-required-error) – 2010-10-09 09:05:24

+0

@Paul这是关于C++,虽然。 – 2010-10-09 09:08:47

回答

7

左值是“可分配的东西”

所以,寻找一个任务分配时,左手边是不是“分配”的东西,可以在赋值语句的左侧出现,换言之,例如,这样简单的东西可能会引发这样的错误

if (0 = foo) 
{ 

} 

在这里你有一个试图向一个常数,因为不小心使用=,而不是==

5

这意味着实现预期的目标,但你只是传递一个值或功能。这发生在您通过非左值的分配或应用于非函数的操作地址上。

左值代表“位置值”,并且表示引用声明为register或存储位置的对象的表达式。类似42的值与两个条件都不匹配。更正式地有三个类别

  • 左值:参考对象。这包括声明为const的对象。这些是不可修改的左值。
  • 函数指示符:指函数。 printf是一个函数指示符,但&printf不是,而*&printf又是。
  • 其他:有时称为“右值”,由标准描述为“表达的价值”。示例为var + 0(产生与对象无关的值)或枚举的枚举器。 &printf属于这一类。
0

如果你编码somrthing像function(parameter) = value;,因为你不能给任何不是可能的容器的值分配值的错误cometh。

2

C99标准状态(6.3.2.1):


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

名称lvalue从赋值表达式E1 = E2,其中左操作数E1需要是一个(修改)lvalue来原本。它可能更好地被认为代表一个对象“定位器值”。有时称为rvalue的是在此国际标准中描述为“表达的价值”。


换句话说,一个lvalue的东西,你可以找到用于潜在地改变。一个可修改的lvalue是一个实际上允许更改

例如,将C语句:

x = 7; 

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

14 = 7; 

是无效的,因为14东西,你可以找到一个分配。

的片段:

const int x = 7; 

实际上创建了一个名为lvaluex即使你不允许改变它(它不是一个修改`左值)。

+1

nit picking,但从技术上讲,这也可以是用'register'声明的变量,所以它可能没有地址。 – 2010-10-09 09:22:28

+0

“如果一个左值没有指定一个对象,当它被评估时,行为是undefined._”,除非行为是_not_ undefined:'&*(int *)0;'(sic) – curiousguy 2011-12-25 18:18:42

0

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

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