【发布时间】:2014-02-16 13:49:43
【问题描述】:
我刚刚了解到以下事实:
前缀递增 (++var_name) 的结果是 C 中的 R 值(至少,我是 确保它不是 C 中的 L 值),但它是 C++ 中的 L 值。
后缀递增 (var_name++) 的结果是 C 中的 R 值(至少,我是 确保它不是 C 中的 L 值)。这在 C++ 中也是如此(它表示结果 是prvalue)。
我在 VS2010(.cpp 和 .c)和 Ubuntu(gcc 和 g++)中检查了这些。
在 C++ Standard 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-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 值的原因。我只知道
We can assign a value to a (modifiable) L-value, for example, a variable name. R-value is a value of an expression.
但我不知道为什么 postfix ++ 在 C 和 C++ 中不是 L 值,以及为什么 prefix ++ 在 C 中没有。(我看到类似“postfix ++...存储...在一个临时地址,然后...”,但我还是不明白)。
还有一个问题是为什么前缀++在C和C++中是不同的?使前缀 ++ 成为 L 值(在 C++ 中)有很多优点?如果是这样,为什么C不改变这个? (除了向后兼容性之外的其他原因,或者至少为什么更改它会导致很多问题)。
【问题讨论】:
-
您说您在 VS2010 和 gcc 中检查了您的假设。您使用什么代码来验证您对这些问题的假设?
-
""(我看到类似“postfix ++...store...in a temporary address, then...”,但我还是不明白)"" - 也许如果您引用了您没有得到的标准中的整个句子,有人可以为您澄清。
-
@Brandin,它不在标准中。我在一本书上看到它,上面写着“第三条语句中的表达式 a++ 是一个右值,因为它临时存储 a 的值作为表达式的结果,然后递增 a 。”
-
另外,只需使用
(a++) = 3、(++a) = 3之类的语句。 -
这些示例在不同的 C 和 C++ 编译器上会产生不同的结果吗?我以为你的问题是关于 C 和 C++ 之间的区别。
标签: c++ c operators operand operands