错误消息“需要左值”实际上是什么意思?
5 回答
左值是可以出现在赋值左侧的东西,换句话说,“可以被赋值的东西”
所以,寻找一个左侧不是“可赋值”的赋值,例如,像这样简单的事情可能会触发这样的错误
if (0 = foo)
{
}
在这里,由于意外使用 = 而不是 ==,您尝试分配给常量
也可以看看
这意味着实现需要一个对象,但您只是传递了一个值或函数。这发生在您传递非左值的赋值或应用于非函数的地址操作。
Lvalue 代表“位置值”,表示引用声明为register
内存位置或内存位置的对象的表达式。类似的东西42
是既不符合条件的值。更正式地有三类
- Lvalues:引用对象。这包括声明为 const 的对象。这些是不可修改的左值。
- 功能指示符:指功能。
printf
是函数指示符,但&printf
不是,while*&printf
又是。 - 其他:有时称为“右值”,被标准描述为“表达式的值”。示例是
var + 0
(产生一个不再与对象关联的值)或枚举的枚举数。&printf
属于这一类。
C99 标准规定 (6.3.2.1):
Anlvalue
是具有对象类型或除 void 之外的不完整类型的表达式;如果在lvalue
评估时未指定对象,则行为未定义。当一个对象被称为具有特定类型时,该类型由lvalue
用于指定该对象的 指定。可修改lvalue
是lvalue
没有数组类型,没有不完整类型,没有 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
如果您编写类似的代码,则会出现错误,function(parameter) = value;
因为您无法为任何不可能的容器赋值。
很可能这意味着您试图为无法分配的东西分配值。例如,以下两种情况都可能导致该错误:
5 = 5; 我的对象->我的方法()= 5;