0

在下面的代码中:

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

这个程序给出了错误"L-Value required"

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

4

5 回答 5

7

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

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

2.8 递增和递减运算符

(第 44 页)

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

相关:在 gcc 4.4.5 中可能想知道的一个有趣的错误是表达式j = ++(i | i);编译应该产生左值错误。阅读:j = ++(i | i);并且j = ++(i & i);应该出现错误:左值?

此外,在没有插入序列点的情况下在表达式中多次修改同一变量会导致未定义的行为。要理解,请阅读解释这些未定义的行为i = i++ + ++i;

于 2013-07-25T06:49:08.400 回答
1

通常,您不应该这样做,因为它会使代码变得模糊。
您收到错误的原因是后增量有先例,因此返回一个 r 值,即++i++ == ++(i++)不能递增。

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

于 2013-07-25T06:58:00.563 回答
0

这一行:

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

==>

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

==>

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

看到你使用 (++i) 作为左值。

于 2013-07-25T06:54:47.653 回答
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
于 2013-07-25T06:54:51.743 回答
0

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

你所拥有的有点相当于:++(5)这显然是非法的,因为你可以在不是左值的东西上应用前缀增量。

于 2013-07-25T06:57:22.453 回答