c表达式与c ++表达式之间的差异

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

这个程序适用于g ++编译器,但不适用于gcc。 如果我写i ++++或++ i ++,它也不能用于cpp。 我认为c-expression和c ++ – expression之间存在差异。 有人可以解释L值和R值吗?

编辑:此答案对于更新的问题不正确,它适用于最初声明的问题。

(i++)++不应该使用gcc或g ++,无论它们是否在两种语言中将文件解析为C或C ++,后缀增量都需要左值作为操作数,结果是rvalue

(注意, rvalue仅在C ++中正式使用。在C中,表达式的结果要么是明确的左值,要么它们不是 。术语rvalue根本不用于C标准的规范性文本中。)

简单地说, 左值是指一个对象的表达式,即概念上某个地方的存储区域。 可修改的左值是指定给它的有效值,因此可以出现在赋值表达式的左侧

右值只是一个值,您可以从中分配可修改的左值 ,但不能分配给您的值。 它只能出现在赋值表达式的右侧

g++给出了错误: lvalue required as increment operand

前缀增量(和减量)略有不同。 在C ++中,前缀增量的结果显式为左值 (5.3.2 / 1 [expr.pre.incr]); 在C中它明确地不是左值 (6.5.3.1表示++ E等价于(E + = 1); 6.5.16表示任何赋值的结果不是左值)。

(++i)++因此,++在语义上只在C (++i)++是正确的,但它具有未定义的行为,因为您将一个值存储到一个对象两次而没有插入序列点

来自维基:

有些语言使用左值和左值的概念。 左值是具有以编程方式可由正在运行的程序访问的地址的值(例如,通过某些运算符地址,如C ++中的“&”),这意味着它们是对某个存储位置的变量或解引用引用。 Rvalues可以是左值(见下文)或非左值 – 仅用于区分左值的术语。 在C中,术语lvalue最初意味着可以分配的东西(来自左值,表示它位于赋值运算符的左侧),但由于’const’被添加到语言中,现在称为’可修改的左值’。

$ 5.2.6-

通过应用后缀++获得的值是操作数在应用运算符之前所具有的值。 [注意:获得的值是原始值的副本]操作数应该是可修改的左值。 操作数的类型应为算术类型或指向完整对象类型的指针。 注意到结果后,通过向对象添加1来修改对象的值,除非该对象的类型为bool,在这种情况下将其设置为true。 [注意:此用法已弃用,请参见附录D.] 结果是右值。 结果的类型是操作数类型的cv-nonqualified版本。 另见5.7和5.17。

$ 5.3.2 / 1

“前缀++的操作数通过添加1来修改,或者如果它是bool则设置为true(这个用法已被弃用)。 操作数应该是一个可修改的左值。

这应该可以解释你为C ++带来的错误。