如何Lvalue需要错误

时间:2013-09-09 11:53:54

标签: c lvalue

有一段代码产生“Lvalue required”的错误。代码是,

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

很明显Lvalue错误会出现在上面的代码中,所以我将代码更改为

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

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

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

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

5 个答案:

答案 0 :(得分:5)

max是文字,因此max++会失败。 (正如10++会失败)。

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

请记住{<1}}由预处理器解析,编译之前发生

解释编译器的返回错误:

松散地说, lValue 是作业左侧的东西;即在

#define

a = b; 是lValue。语句a显然没有意义(你不能将值赋值给10):更正式地说它是无效的,因为10不是l值。

答案 1 :(得分:2)

在预处理之后,

max替换为10,这是#define应该做的事情。

10是右值或字面值。没有与赋值相关的操作应该对文字做。但++操作涉及分配。

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

答案 2 :(得分:2)

预处理后,

max将替换为10,所以

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

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

答案 3 :(得分:2)

您需要了解编译器宏定义。

如果你打字,他们实际做的是:

#define SOMETHING 3
在编译代码之前,

正在使用更多值更改某些内容。

如果您使用此类宏,则类似:

#define SOMETHING(x) (x + x)

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

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

值++被转换为操作值=值+ 1,如果使用了变量,则不会导致任何问题。但是,您使用的“max”不是任何类型的变量,而是从预处理器定义为常量变量的宏。预处理器会将每个最大值交换为10,所以最终会得到10 ++的表达式,它将评估为10 = 10 + 1,这是错误的。

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

答案 4 :(得分:0)

请记住,++运算符有副作用更新其操作数的值;要使其工作,操作数必须是 lvalue ,这是一个表达式,指的是一个内存位置,以便可以读取或修改内存;遗憾的是,没有为10之类的整数常量留出内存,因此出现错误消息。