我刚刚了解到以下事实:
前缀递增 (++var_name) 的结果是 C 中的 R 值(至少,我确信它不是 C 中的 L 值),但它是 C++ 中的 L 值。
后缀增量 (var_name++) 的结果是 C 中的 R 值(至少,我确信它不是 C 中的 L 值)。在 C++ 中也是如此(它说结果是纯右值)。
我在 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 非限定版本。另见 5.7 和 5.17。
(虽然我不知道 R 值和 prvalue 之间的区别)。
至于 C 标准http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf,前缀 ++ 在 6.5.3.1 中描述,后缀在 6.5.2.4 中,但从描述,我无法得到明确、明确的答案。
我想知道使它们成为 R 值或 L 值的原因。我所知道的是
We can assign a value to a (modifiable) L-value, for example, a variable name. R-value is a value of an expression.
但我不知道为什么后缀 ++ 不是 C 和 C++ 中的 L 值,以及为什么前缀 ++ 不是 C 中的详细信息。(我看到类似“后缀 ++...store...in一个临时地址,然后......”,但我还是不明白)。
另一个问题是为什么前缀 ++ 在 C 和 C++ 中是不同的?使前缀 ++ 成为 L 值(在 C++ 中)有很多优点?如果是这样,为什么C不改变这个?(除了向后兼容性之外的其他原因,或者至少为什么改变它会导致很多问题)。