在下面的代码中:
main()
{
int i = 5;
printf("%d", ++i++);
}
这个程序给出了错误"L-Value required"
。
有人可以告诉我:为什么会出现编译错误?
在下面的代码中:
main()
{
int i = 5;
printf("%d", ++i++);
}
这个程序给出了错误"L-Value required"
。
有人可以告诉我:为什么会出现编译错误?
因为后缀运算符的优先级高于前缀运算符,所以表达式++i++
等价于 ++(i++)
,即等价于 ++( i + 1)
。编译器给出左值错误,因为您应用++
的表达式(i++)
不是可修改的左值,因此根据增量运算符定义不是c中的有效表达式。
根据 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);
应该出现错误:左值?
此外,在没有插入序列点的情况下在表达式中多次修改同一变量会导致c和c++中未定义的行为。要理解,请阅读解释这些未定义的行为。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 => 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
该表达式++i++
被评估为++(i++)
在 C 中是非法的,因为后缀增量返回一个值,而在该值上递增的前缀没有意义。
你所拥有的有点相当于:++(5)
这显然是非法的,因为你可以在不是左值的东西上应用前缀增量。