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

时间:2010-08-26 07:06:02

标签: c++ c operator-precedence

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

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

3 个答案:

答案 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 ++带来的错误。