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

lef*_*out 11 c++ increment operator-precedence prefix-operator postfix-operator

这样定义,我们既不做++x++也不做++x--.但另一方面,无论是(++x)++(++x)--是有用的表达式:(++x)++增量x由两个并返回"中间"的价值,而(++x)--实质上等同于x+1而是完全避免了打电话operator+,这是非常有用的时候.

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

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


所以...对我来说,我会得出答案:

具有简单的和精心memorizeable优先列表,其中的优点所有之前来后缀运算符任何前缀运营商足以容忍的总是不必使用括号来构成前和后缀运算符的小缺点++/ --,因为该组合物是非常少用.

更简单的"C就是这样做的",虽然看起来可能是真正的原因,但对我来说远不那么令人满意,因为C中++x++根本不允许这样,所以可以重新定义这个非常复杂的构图而不会损坏任何构图.现有代码.

无论如何,我会继续使用(++x)--,因为括号真的没有那么多伤害.

Joh*_*itb 6

(++x)++递增x2并返回"中间"的值

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


(++x)--本质上相当于x+1但完全避免必须调用operator+,这有时非常有用.

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

x+1基本上相当于(++x)--但完全避免必须调用operator++,operator--有时可能有用.


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

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


APr*_*mer 5

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

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