我刚刚了解到以下事实:
我在 VS2010(.cpp 和 .c)和 Ubuntu(gcc 和 g++)中检查了这些。
在 C++ 标准第 109 页(5.3.2)中http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf, 这个已经写完了
前缀++的操作数通过加1来修改,或者如果它是bool则设置为true(不推荐使用这种用法)。这
操作数应是可修改的左值。操作数的类型应为算术类型或指向
完全定义的对象类型。结果是更新后的操作数;它是一个左值, and...
并在第 101 页中,(5.2.6)
后缀++表达式的值是其操作数的值。 ...结果是
纯右值。结果的类型是操作数类型的 cv 未限定版本。另见 5.7 和 5.17。
(不过我不知道 R 值和纯右值之间的区别)。
对于C标准http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf,
prefix ++在6.5.3.1中描述,postfix在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 中不是 L 值。(我看到类似“postfix ++...存储...在临时地址中,然后...”,但我仍然不明白)。
还有一个问题是为什么前缀++在C和C++中不同?将 prefix ++ 设为 L 值(在 C++ 中)有很多优点吗?如果是这样,为什么 C 不改变这一点? (除了向后兼容性之外的其他原因,或者至少为什么更改它会导致很多问题)。
C 和 C++ 是不同的语言。 C++ 有运算符重载,而 C 没有。这++运算符,无论是前缀还是后缀,都是可以在 C++ 中重载的运算符。 C++也有引用,而C没有。
In C, ++i and i++两者都产生一个不是值lvalue。这是可取的,否则您可能会因尝试修改相同序列点边界内的相同标量而与未定义的行为发生冲突。
深思:在 C 语言中,逗号运算符也会产生一个不是左值的值,因此要“删除”低价值, 你可以做:
(0, lvalue)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)