5

There is a piece of code which is producing error of "Lvalue required". The code is as,

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

It was evident that Lvalue error will come in above code so i changed the code to

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

I thought now the value of constant is assigned to a proper variable but still the error appeared. Then i checked for

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

it works without any error.What is the problem with the second piece of code ?

4

5 回答 5

5

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

但是,max + 1是有效的(原样10 + 1)。

请记住, s 由发生编译之前的预处理器#define解析。

解释编译器的返回错误:

松散地说,lValue是赋值左侧的东西。即在

a = b;

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

于 2013-09-09T11:56:05.640 回答
2

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

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

例如,你可以10++;为文字 10 做。

于 2013-09-09T11:57:10.097 回答
2

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

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

a=max+1 => a=10+1 //Works
于 2013-09-09T11:57:45.237 回答
2

您需要阅读有关编译器宏定义的信息。

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

#define SOMETHING 3

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

如果您使用这样的宏,则类似:

#define SOMETHING(x) (x + x)

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

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

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

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

于 2013-09-09T11:59:28.807 回答
0

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

于 2013-09-09T13:28:50.593 回答