在C ++中,pre-increment运算符给出左值,因为返回了递增的对象本身,而不是副本。 但在C中,它给出了右值。为什么?
答案 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
,您可以随时撰写i
或Index
:
答案 2 :(得分:2)
在我的脑海中,我无法想象使用预增量变量作为左值可能导致的任何有用的陈述。在C ++中,由于运算符重载的存在,我可以。由于这种限制,您是否有一个特定的例子表明您在C中无法做到这一点?