我刚学到了以下事实:
前缀增量(++var_name)在C中是一个R值(至少,我确定它不是C中的L值),但在C++中它是一个L值。
后缀增量(var_name++)在C中是一个R值(至少,我确定它不是C中的L值)。这也适用于C++(它说结果是一个prvalue)。
我在VS2010(.cpp和.c)和Ubuntu(gcc和g++)中进行了检查。
在C++标准http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf的p.109(5.3.2)中,写道
前缀增量(++var_name)在C中是一个R值(至少,我确定它不是C中的L值),但在C++中它是一个L值。
后缀增量(var_name++)在C中是一个R值(至少,我确定它不是C中的L值)。这也适用于C++(它说结果是一个prvalue)。
我在VS2010(.cpp和.c)和Ubuntu(gcc和g++)中进行了检查。
在C++标准http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf的p.109(5.3.2)中,写道
前缀 ++ 的操作数通过加1进行修改,或者如果它是 bool 类型,则设置为 true(此用法已被弃用)。 操作数必须是可修改的左值。 操作数的类型必须是算术类型或指向完全定义的对象类型的指针。 结果是更新后的操作数;它是一个左值,...
在第101页中,(5.2.6)
后缀 ++ 表达式的值是其操作数的值。...结果是 prvalue。 结果的类型是操作数类型的 cv-unqualified 版本。另请参见 5.7 和 5.17。
(我不知道 R-value 和 prvalue 之间的区别,但是)关于 C 标准 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf,前缀 ++ 描述在 6.5.3.1 中,后缀 ++ 描述在 6.5.2.4 中,但从描述中,我无法得到清晰明确的答案。
我想知道它们成为R值或L值的原因。我所知道的是,我们可以将值赋给(可修改的)L值,例如变量名。R值是表达式的值。但我不知道后缀++在C和C ++中为什么不是L值,以及为什么前缀++在C中不是L值的细节。(我看到过像“后缀++...存储...在临时地址中,然后...”这样的东西,但我还是不明白)。另一个问题是为什么C和C ++中的前缀++不同?使前缀++成为L值(在C ++中)有很多优点吗?如果是这样,为什么C不改变呢?(除了向后兼容之外的其他原因,或者至少为什么更改会引起很多问题)。
(a++) = 3
、(++a) = 3
的语句。 - user565739