2010-08-26 114 views
2
int main() 
{ 
    int i=3; 
    (++i)++;   
    printf("%d",i); 
} 

这个程序使用g ++编译器,但不使用gcc。 如果我编写i ++++或++ i ++,它也不适用于cpp。 我认为c表达式和C++表达式是有区别的。 有人可以解释有关L值和R值吗?c的表达式和C++的表达式之间的区别

+0

无意中我按下了回滚按钮! – Jagan 2010-08-26 07:37:09

+1

这样的愚蠢表达式是无效的(而且不能被人类解析),所以试图弄清楚为什么一种语言接受它们而另一种语言不是静音。 – 2010-08-26 07:50:29

+0

“作品”只有在你能解释你认为它会做什么时才有意义。你认为'(i ++)++'应该怎么做? – RBerteig 2010-08-26 08:10:53

回答

8

编辑:此答案对更新后的问题不正确,它适用于原始陈述的问题。

(i++)++不应任一的gcc或g ++工作,无论它们是否在这两种语言后缀增量解析该文件作为C或C++需要左值作为操作数和结果是一个右值

(注:右值在C仅用于正式++,在C表达式的结果要么是明确左值或者他们只是不左值右值没有在使用的术语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++语义正确,但是它有因为你是存储一个值的一个对象两次而没有中间序列点未定义行为

+0

@Charles Bailey:我的猜测是c表达式返回r值,C++表达式返回l值。 – Jagan 2010-08-26 07:24:05

+0

@Jagan:你为什么认为你应该猜测?这是不正确的;在C和C++中,后缀增量表达式的结果都是_rvalue_。 – 2010-08-26 07:28:56

+0

@Charles Bailey:那么preincrement表达式呢? – Jagan 2010-08-26 07:33:01

0

从维基:

Some languages use the idea of lvalues and rvalues. Lvalues are values that have addresses being programmatically accessible to the running program (e.g., via some address-of–operator like "&" in C++), meaning that they are variables or dereferenced references to a certain memory location. Rvalues can be lvalues (see below.) or non-lvalues—a term only used to distinguish from lvalues. In C, the term lvalue originally meant something that could be assigned to (coming from left-value, indicating it was on the left side of the assignment operator), but since 'const' was added to the language, this now is termed a 'modifiable lvalue'.

0

$ 5.2.6-

通过将后缀++所获得的价值在于操作应用操作之前的值。 [注:获得的值是原始值的副本]操作数应该是可修改的左值。操作数的类型应为算术类型或指向完整对象类型的指针。在记录结果之后,通过将对象的值加1来修改对象的值,除非对象的类型为bool,在这种情况下,它将被设置为true。 [注:此用法已弃用,请参阅附录D.] 结果是一个右值。结果的类型是操作数类型的cv不合格版本。另见5.7和5.17。

$ 5.3.2/1-

“前缀++的操作数通过将1改性,或设置为真,如果它是布尔(该用途的建议使用)。操作数应是一个修改的左值

这应该解释你为C++获得的错误。