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

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

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

C99 6.5.3.1/2

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

''value of an expression'' <=> rvalue

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

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

名称”左值’最初来自赋值表达式E1 = E2,其中左操作数E1需要是(可修改的)左值。 它可能更好地被视为表示对象的“定位器值”。 有时被称为”rvalue’的东西在本国际标准中被描述为”表达的价值”

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


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

重新加载未定义的行为和序列点

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