为什么postfix operator ++的优先级高于前缀operator ++?

时间:2011-05-22 07:29:21

标签: c++ increment operator-precedence prefix-operator postfix-operator

这样定义,我们既不能++x++也不能++x--。但另一方面,(++x)++(++x)--都是有用的表达式:(++x)++x递增2并返回值“在中间”,而{{1} }基本上等同于(++x)--但完全避免必须调用x+1,这有时非常有用。

那么为什么没有定义优先级让operator+自动扩展为++x++而不是(++x)++?后者是否有一些隐藏的含义,我不明白,或者只是将优先级保持为一个简单的列表,所有前缀运算符组成一个单独的级别?

编辑好的,我没有明确说出来,但是:我当然认为++(x++)是用户定义的类型。对于内置类型,x当然优于(x+=2)-1(++x)++ 优于x+1。我想到的情况是一个相当复杂的半关联容器的迭代器,其中运算符(++x)--+=(设计用于随机访问)必须重建缓存才能工作有效地用于一般请求,因此比+慢一个数量级。但是我当然可以修改它们以便总是首先检查参数是否是一个非常小的整数,并且在这种情况下只是反复调用++而不是执行随机访问过程。这应该可以在这里工作,虽然我可以想象我可能在某种程度上有一种情况,我希望operator++始终采用随机访问方式,无论我呈现的数字有多少。

<小时/> 所以...对我来说,我会得出答案:

  

拥有一个简单且可记忆良好的优先级列表的优势,其中所有后缀运算符出现在前缀运算符任何之前足以容忍始终存在的小缺点必须使用括号来组成前缀和后缀操作符operator+= / ++,因为这种组合很少使用。

更简单的“C就是这样做的”,虽然它似乎可能是真正的原因,对我来说远不那么令人满意,因为--不允许在C中完全,可以在不损坏任何现有代码的情况下重新定义这个组合。

无论如何,我会继续使用++x++,因为括号真的不会受到太大伤害。

3 个答案:

答案 0 :(得分:6)

  

(++x)++x递增2并返回值“在中间”

为什么不(x += 2) - 1(++x, x++)?两者似乎都更清楚。对于标量,两者在C ++ 03中都有明确的定义,而不是你提出的表达式。


  

(++x)--基本上等同于x+1但完全避免必须调用operator+,这有时非常有用。

这是一个没有任何解释的任意陈述。所以我要扔进游泳池:

  

x+1基本上等同于(++x)--,但完全避免必须调用operator++operator--,这有时会很有用。


  

那么为什么没有定义优先级让++ x ++自动扩展为(++ x)++而不是++(x ++)

只是为了让这种神秘的角落案例没有错误?没门。你能为我背诵man operator吗?如果您不能这样做,最好不要尝试在代码中编写++x++

答案 1 :(得分:5)

C ++标准只是保留了C规则,显然这些规则并没有被修复,考虑到运算符重载和习惯用法仍然是用一种尚未发明的语言发明的。

查看D.M. Ritchie Home Page中可用的内容,看看此优先级已经存在于B中(一元运算符从右到左绑定。因此-!x++绑定-(!(x++)) 用户参考B 中的,我没有在BCPL中看到增量运算符。

答案 2 :(得分:1)

(++x)++(++x)--都会调用undefined behaviour [假设x是基本类型]。对于用户定义的类型,方案would be different。但是,通常不建议在代码中使用此类混淆表达式

就优先权而言this answer解释了为什么后期增量的优先级高于预增量。