为什么预增量运算符在C中给出rvalue?

时间:2011-01-26 07:47:16

标签: c++ c rvalue lvalue

在C ++中,pre-increment运算符给出左值,因为返回了递增的对象本身,而不是副本。 但在C中,它给出了右值。为什么?

3 个答案:

答案 0 :(得分:16)

C没有参考。在C ++中++i返回对i(左值)的引用,而在C中它返回一个副本(递增)。

C99 6.5.3.1/2

  

pre fi x ++运算符的操作数的值递增。 结果是增量后操作数的新值。表达式++ Eis等价于(E + = 1)。

‘‘value of an expression’’ <=> rvalue

然而,由于历史原因,我认为“引用不属于C”可能是一个可能的原因。

答案 1 :(得分:3)

C99在脚注(第6.3.2.1节)中说,

  

最初名称''左值''   从赋值表达式E1 =   E2,其中左操作数E1为   要求是(可修改的)左值。   它可能更好地被视为   表示对象的''定位器   值''。 有时候叫什么   ''rvalue''在这个国际   标准描述为''的价值   表达式''

希望能解释为什么C中的++i会返回rvalue。


对于C ++,我想说它取决于对象的增量。如果对象的类型是某种用户定义的类型,那么它可能总是返回左值。这意味着,如果此处定义的i++++++++类型为++++++i,您可以随时撰写iIndex

Undefined behavior and sequence points reloaded

答案 2 :(得分:2)

在我的脑海中,我无法想象使用预增量变量作为左值可能导致的任何有用的陈述。在C ++中,由于运算符重载的存在,我可以。由于这种限制,您是否有一个特定的例子表明您在C中无法做到这一点?