【问题标题】:How there is Lvalue required error如何存在 Lvalue required 错误
【发布时间】:2013-09-09 11:53:53
【问题描述】:

有一段代码产生“需要左值”的错误。代码如下,

     #include<stdio.h>
     #include<conio.h>
     #define max 10
     int main()
     {
      printf("%d",max++);
      return 0;
     }

显然左值错误会出现在上面的代码中,所以我将代码更改为

     int a;
     printf("%d",a=max++); 

我认为现在常量的值已分配给适当的变量,但仍然出现错误。然后我检查了

     printf("%d",a=max+1);

它没有任何错误。第二段代码有什么问题?

【问题讨论】:

  • 你对10++有什么期望?
  • 这是新事物。 +1。
  • 但是,(a=max)++ 会编译。

标签: c lvalue


【解决方案1】:

max 是一个文字,所以max++ 会失败。 (就像10++ 会失败一样)。

但是,max + 1 是有效的(就像 10 + 1 一样)。

请记住,#defines 由 预处理器 解析,这发生在编译发生之前

解释你的编译器的返回错误:

简单地说,lValue 是赋值左侧的东西;即在

a = b;

a 是 lValue。声明 10 = b; 显然毫无意义(你不能给 10 赋值):更正式地说,它是无效的,因为 10 不是 lValue。

【讨论】:

  • 你的意思是 max 是一个关键字?
  • @mrigendra,不,您将其定义为文字 10。
  • @mrigendra:你给它的每一个字都会失败。请参阅我的(修改后的)答案中的最终评论。
【解决方案2】:

max经过预处理后会被替换为10,所以

max++ => 10++      //Error  ++ requires lvalue
a=max++ => a=10++  //Error  same as above

a=max+1 => a=10+1 //Works

【讨论】:

  • ++ 是一个作业。同样10 = 10 + 1 是非法的,10++ 是非法的。
  • 第二个是否意味着 a=10=10+1 ,这就是为什么它是一个左值错误
  • @mrigendra 如果您认为a=max++ 在编译前更改为a=10=0+1,情况并非如此,但它会在编译前更改a=10++,并且“lvalue”是对具有存储空间的对象的引用,一个可识别的地址,“lvalue required error”表示编译器需要一个可以执行操作的存储。
【解决方案3】:

您需要阅读编译器宏定义。

如果你输入,他们实际上会做:

#define SOMETHING 3

在编译代码之前用更多的值改变每一次出现的东西。

如果你使用这样的宏类似:

#define SOMETHING(x) (x + x)

它将 SOMETHING(value) 的出现更改为 value + value。

LValue 基本上是可以在赋值运算符左侧使用的操作数,在您的情况下它可以是“a”变量。

value++ 被转换为操作 value = value + 1 并且如果使用了该变量不会导致任何问题。但是,您使用了“max”,它不是任何类型的变量,而是从您的预处理器中定义为常量变量的宏。预处理器会将每个最大值交换为 10,因此您最终得到表达式 10++,其计算结果为 10 = 10 + 1,这是错误的。

注意:您应该使用带有大写皮革的定义,以便更容易区分变量和预处理器定义。

【讨论】:

    【解决方案4】:

    在 c 预处理之后,max 被替换为 10,这是 #define 应该做的。

    10 是一个右值或文字。不应对文字进行任何与赋值相关的操作。但是++操作涉及到赋值。

    例如,您可以为文字 10 执行 10++;

    【讨论】:

      【解决方案5】:

      请记住,++ 运算符具有更新其操作数值的副作用;为此,操作数必须是 lvalue,这是一个引用内存位置的表达式,以便可以读取或修改内存;不幸的是,没有为像 10 这样的整数常量留出内存,因此出现了错误消息。

      【讨论】:

        猜你喜欢
        • 2021-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        • 2017-12-10
        • 2018-01-25
        • 1970-01-01
        • 2022-11-07
        相关资源
        最近更新 更多