在下面的代码中:
main()
{
int i = 5;
printf("%d", ++i++);
}
本程序提供错误"L-Value required"
。
有人可以告诉我:为什么编译错误?
答案 0 :(得分:7)
因为后缀运算符的优先级高于前缀运算符,所以表达式++i++
等同于++(i++)
,相当于++( i + 1)
。编译器给出l值错误,因为您在不可修改的左值的表达式++
上应用(i++)
,因此c中的有效表达式不是增加运算符定义。
根据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和c中的c++。要理解阅读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值的东西应用前缀增量。