为什么++ i ++在C中给出“L值必需错误”?

时间:2013-07-25 06:44:03

标签: c

在下面的代码中:

main()
{
  int i = 5;
  printf("%d", ++i++);
}

本程序提供错误"L-Value required"

有人可以告诉我为什么编译错误?

5 个答案:

答案 0 :(得分:7)

因为后缀运算符的优先级高于前缀运算符,所以表达式++i++等同于++(i++),相当于++( i + 1)。编译器给出l值错误,因为您在可修改的左值的表达式++上应用(i++),因此中的有效表达式不是增加运算符定义。

根据Dennis M. Ritchie的书:"The C Programming Language"

  

2.8增量和减量运算符

     

(第44页)

     

增量和减量运算符只能应用于变量;像(i + j)++这样的表达是非法的。操作数必须是算术或指针类型的modifiable lvalue

相关:人们在gcc 4.4.5中可能想知道的一个有趣的错误是表达式j = ++(i | i);编译应该产生l值错误。阅读:j = ++(i | i); and j = ++(i & i); should an error: lvalue?

此外,在表达式中修改相同的变量多一次而没有介入的sequence point导致undefined behavior中的。要理解阅读Explain these undefined behaviors in i = i++ + ++i;

答案 1 :(得分:1)

一般来说,你不应这样做,因为它会掩盖代码 你得到错误的原因是后增量有先例,因此返回一个r值,即++i++ == ++(i++),它不能递增。

但是,你可以使用(++i)++,因为预增量(显然,在VS2010上)返回i本身,一个l值,可以后递增。

答案 2 :(得分:0)

这一行:

printf("%d",++i++)

==>

printf("%d",(++i)++)

并且

==>

 printf("%d",(++i)); &(++i)++ ==> (++i) = (++i) +1;

请参阅使用(++ i)作为左值。

答案 3 :(得分:0)

这是因为你正在增加一个常数..

在你的情况下

++i => 6
++i++ => 6++ //this is not possible. Gives lvalue error
++i+10 => 6+10 => 16 //this is possible

所以做++ i ++并不好。 后增量/减量,仅在变量上增加/减少。在运行时,您的语句将变为常量,因此它在此处给出左值错误。

++i => 6 => i=6;
i++ => 6 => i=7;
printf("%d",i); //7

答案 4 :(得分:0)

表达式++i++被评估为++(i++),这在C中是非法的,因为后缀增量返回一个值,并且在上递增前缀是没有意义的。

你拥有的东西有点等同于:++(5)这显然是非法的,因为你可以对不是l值的东西应用前缀增量。