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

在下面的代码中:

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

本程序给出错误"L-Value required"

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

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

根据Dennis M. Ritchie的书: “C编程语言” :

2.8增量和减量运算符

(第44页)

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

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

另外,在没有插入序列点的表达式中多次修改相同的变量会导致c和c ++中的 未定义行为 。 理解阅读在i = i++ + ++i;解释这些未定义的行为i = i++ + ++i;

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

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

这一行:

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

==>

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

==>

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

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

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

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

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

在你的情况下

 ++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