为什么++ 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