定义这种方式,我们既不能做++x++
也不能做++x--
。但在另一方面,无论(++x)++
和(++x)--
是有用的表达式:(++x)++
增量x
由两个并返回“中间”的值,而(++x)--
实质上等同于x+1
但完全避免了打电话operator+
,这是非常有用的,有时。为什么postfix operator ++比前缀operator ++具有更高的优先级?
那么为什么优先级没有被定义为++x++
自动扩展到(++x)++
而不是++(x++)
?对于后者我有一些不明白的含义,还是仅仅将优先级保持为一个简单列表,并且所有前缀运算符构成一个单一级别?
编辑好的,我没有明确说出来,但是:当然我的意思是x
是用户定义的类型。对于内置类型,(x+=2)-1
当然好于(++x)++
,而x+1
是lot好于(++x)--
。我想到的情况是一个相当复杂类型的半关联容器的迭代器,其中操作符+=
和+
(专为随机访问而设计)必须重建缓存以便为一般请求高效工作,因此比++
慢一个数量级。但是我当然可以修改它们,以便首先检查参数是否是非常小的整数,在这种情况下,只需重复调用operator++
而不是随机访问过程。这应该可以在这里很好地工作,尽管我可以想象我可能在某种程度上有一种情况,我希望operator+=
总是以随机访问的方式进行,而不管我呈现的数字有多少。
所以......我,我可以得出结论,答案是:
具有简单和幸福memorizeable优先级表的优点,即任何来之前所有后缀运算符前缀运算符的足以容忍总是必须使用括号来组成前缀和后缀运算符的小缺陷,因为该组合很少被使用。
更简单的“C确实是这样”,而这很可能是真正原因,是迄今为止对我不太满意,因为自从++x++
是不是在C它会在所有允许可以在不破坏现有代码的情况下重新定义这种构图。
无论如何,我会继续使用(++x)--
,因为圆括号确实不会伤害太多。
即使这些例子不是ub,由于混淆的余地很大,所以很少有效用 – 2011-05-22 07:36:17
都不是在C++中的UB 0x – 2011-05-22 07:42:11
最初的C规范是否有任何关于这些运算符如何分组的说法? – 2011-05-22 09:47:20