【问题标题】:lvalue required需要左值
【发布时间】:2010-10-09 08:48:55
【问题描述】:

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

【问题讨论】:

标签: c lvalue


【解决方案1】:

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

因此,请寻找左侧不可“赋值”的赋值,例如,这样简单的事情可能会触发此类错误

if (0 = foo)
{

}

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

另见

【讨论】:

    【解决方案2】:

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

    Lvalue 代表“位置值”,表示引用声明为register 的对象或内存位置的表达式。 42 之类的值不符合任何条件。更正式地分为三个类别

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

    【讨论】:

      【解决方案3】:

      C99 标准状态 (6.3.2.1):


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

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


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

      例如C语句:

      x = 7;
      

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

      14 = 7;
      

      无效,因为14 不是您可以为分配找到的东西。

      sn-p:

      const int x = 7;
      

      实际上创建了一个名为 xlvalue,即使您不允许更改它(它不是可修改的 `lvalue)。

      【讨论】:

      • 挑剔,但从技术上讲,这也可以是使用register 声明的变量,因此它可能没有地址。
      • "如果左值在计算时未指定对象,则行为未定义。" 除非行为未定义: &*(int*)0;(原文如此)
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2013-08-15
          • 2016-09-03
          • 2016-09-29
          • 1970-01-01
          • 2011-09-03
          相关资源
          最近更新 更多