有一段代码产生“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);
它没有任何错误。第二段代码有什么问题?
答案 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
之类的整数常量留出内存,因此出现错误消息。