12

以这种方式定义,我们既不能做++x++也不做++x--。但另一方面,(++x)++and(++x)--都是有用的表达式:(++x)++递增x2 并返回“中间”的值,while(++x)--本质上等同于x+1但完全避免了调用operator+,这有时非常有用。

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

编辑好吧,我没有明确说出来,但是:当然我的意思x是用户定义的类型。对于内置类型,(x+=2)-1当然比(++x)++,而且x+1比. 我想到的情况是一种相当复杂的半关联容器类型的迭代器,其中操作员和(设计用于随机访问)必须重建缓存才能有效地处理一般请求,因此是一个命令幅度比 慢。但是当然我可以修改它们以始终首先检查参数是否是一个非常小的整数,在这种情况下只需调用(++x)--+=+++operator++重复而不是执行随机访问过程。这在这里应该可以正常工作,尽管我可以想象我可能会在某个时候遇到这样一种情况,即我想operator+=始终采用随机访问方式,而不管我呈现的数字有多小。


所以......对我来说,我的结论是:

拥有一个简单且易于记忆的优先级列表(其中所有后缀运算符都位于任何前缀运算符之前)的优势足以容忍始终必须使用括号来组合前置和后置运算符++/的小缺点--,因为这种组合是很少使用。

更简单的“C 这样做”,虽然这似乎是真正的原因,但对我来说远没有那么令人满意,因为因为在 C++x++中根本不允许所以可以重新定义这个组合而不破坏任何现有代码。

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

4

3 回答 3

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++在你的代码中编写。

于 2011-05-22T08:08:51.327 回答
5

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

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

于 2011-05-22T10:42:46.317 回答
1

两者都(++x)++调用(++x)--未定义的行为[假设 x 是原始类型]。对于用户定义的类型,场景会有所不同。但是,通常不建议在您的代码中使用这种令人困惑的表达式。

就优先级而言,这个答案解释了为什么后增量的优先级高于前增量。

于 2011-05-22T07:32:43.267 回答