【发布时间】:2011-08-30 12:11:27
【问题描述】:
这样定义,我们既不能做++x++也不能做++x--。但另一方面,(++x)++ 和 (++x)-- 都是有用的表达式:(++x)++ 将 x 递增 2 并返回“中间”值,而 (++x)-- 本质上等同于 x+1,但完全避免调用operator+,这有时非常有用。
那么为什么没有定义优先级让++x++ 自动扩展为(++x)++ 而不是++(x++)?后者是否有一些我不明白的隐藏含义,还是只是为了将优先级保持为一个简单的列表,所有前缀运算符构成一个级别?
编辑好的,我没有明确说出来,但是:当然我的意思是x 是用户定义的类型。对于内置类型,(x+=2)-1 当然比(++x)++ 好,x+1 比(++x)-- 好很多。我想到的情况是一种相当复杂的半关联容器类型的迭代器,其中操作员+= 和+(设计用于随机访问)必须重建缓存才能有效地处理一般请求,因此比++ 慢一个数量级。但当然我可以修改它们以始终首先检查参数是否是一个非常小的整数,在这种情况下只需重复调用operator++ 而不是执行随机访问过程。这在这里应该可以正常工作,尽管我可以想象我可能会在某些时候遇到这样一种情况,即我希望 operator+= 始终采用随机访问方式,无论我呈现的数字有多小。
所以......对我来说,我的结论是:
拥有一个简单且易于记忆的优先级列表(其中 all 后缀运算符位于 any 前缀运算符之前的优势足以容忍 always 的小缺点必须使用括号来组合前置和后置运算符
++/--,因为这种组合很少使用。
更简单的“C 这样做”,虽然这似乎是 真正 的原因,但对我来说远没有那么令人满意,因为 ++x++ 不允许在 所有在 C 中都可以重新定义这种组合,而不会损坏任何现有代码。
不管怎样,我会继续使用(++x)--,因为括号真的没有那么痛。
【问题讨论】:
-
即使这些例子不是 ub 也没有什么实用性,因为混淆的范围很大
-
原始 C 规范对这些运算符如何分组有什么要说的吗?
-
如果是这样,我猜它只是让语法更容易编写。
-
在旁注中,每个后缀运算符的优先级都高于每个前缀运算符。我发现这个统一的语法规则在破译复杂的 C 声明符时非常有用。
标签: c++ increment operator-precedence prefix-operator postfix-operator