为什么预增量运算符在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中无法做到的事情?