int main()
{
int i=3;
(++i)++;
printf("%d",i);
}
这个程序适用于g ++编译器,但不适用于gcc。 如果我写i ++++或++ i ++,它在cpp中也不起作用。 我认为c-expression和c ++ - expression之间存在差异。 有人可以解释L值和R值吗?
答案 0 :(得分:8)
编辑:此答案对于更新的问题不正确,它适用于最初声明的问题。
(i++)++
不能与gcc或g ++一起使用,无论他们是否在两种语言中将文件解析为C或C ++,后缀增量都需要 lvalue 作为操作数,并且结果是 rvalue 。
(请注意, rvalue 仅在C ++中正式使用。在C中,表达式的结果是显式的 lvalues ,或者它们只是 lvalues 。术语 rvalue 根本没有在C标准的规范性文本中使用。)
简单地说, lvalue 是一个引用一个对象的表达式,即概念上某个地方的存储区域。可修改的左值是指定给它的有效内容,因此可以出现在赋值表达式的 left 手侧。
rvalue 只是一个值,您可以从中指定可修改的左值,但不能分配给您的值。它只能出现在赋值表达式的 right 一侧。
g++
给出了错误:lvalue required as increment operand
。
前缀增量(和减量)略有不同。在C ++中,前缀增量的结果显式为 lvalue (5.3.2 / 1 [expr.pre.incr]);在C中它明确地不是左值(6.5.3.1表示++ E等价于(E + = 1); 6.5.16表示任何赋值的结果不是左值)。 / p> 因此,
(++i)++
在语义上仅在C ++中是正确的,但它具有未定义的行为,因为您将一个值存储到一个对象两次而没有插入的序列点
答案 1 :(得分:0)
来自wiki:
有些语言使用左值的概念 和rvalues。左值是值 以编程方式具有地址 正在运行的程序可访问 (例如,通过一些运营商地址 喜欢“&”在C ++中),意思是他们 是变量或解除引用 引用某个记忆 地点。 Rvalues可以是左值(见 以下。)或非左值 - 仅限一个术语 用于区分左值。在 C,lvalue一词最初的意思 可以分配给的东西 (来自左值,表示 它在左侧 赋值运算符),但是从那以后 'const'被添加到语言中, 这现在被称为'可修改的 左值”。
答案 2 :(得分:0)
$ 5.2.6 -
通过应用后缀++获得的值是操作数在应用运算符之前的值。 [注意:获得的值是原始值的副本]操作数应该是可修改的左值。操作数的类型应为算术类型或指向完整对象类型的指针。注意到结果后,通过向对象添加1来修改对象的值,除非对象是bool类型,在这种情况下 它设置为true。 [注意:不推荐使用此选项,请参阅附录D.] 结果是rvalue。结果的类型是操作数类型的cv-nonqualified版本。另见5.7和5.17。
$ 5.3.2 / 1-
“前缀++的操作数通过添加1来修改,或者如果它是bool则设置为true(不推荐使用此用法)。操作数应该是可修改的左值。”
这应该解释你为C ++带来的错误。