12

このように定義すると、どちら++x++も実行できません++x--。一方、(++x)++とはどちら(++x)--も便利な式です。は 2(++x)++ずつインクリメントxし、「中間」の値を返します。 while(++x)--は と本質的に同等ですが、x+1を呼び出す必要が完全に回避されますoperator+。これは場合によっては非常に便利です。

では、優先順位がではなくに++x++自動的に展開されるように定義されていないのはなぜですか? 後者には私が理解できない隠された意味がありますか、それとも単一のレベルを構成するすべてのプレフィックス演算子を含む単純なリストの優先順位を維持するためですか?(++x)++++(x++)

編集OK、明示的には言いませんでしたが、もちろん、xユーザー定義型になるつもりでした。組み込み型の場合、(x+=2)-1はもちろん よりも優れており、(++x)++よりもはるかに優れています。私が念頭に置いている状況は、かなり複雑なタイプの半連想コンテナーへのイテレーターであり、オペレーターと(ランダムアクセス用に設計されている) は、一般的な要求に対して効率的に機能するためにキャッシュを再構築する必要があり、したがって命令です。よりも遅い大きさです。もちろん、引数が非常に小さい整数であるかどうかを常に最初に確認するように変更できます。その場合は、単に呼び出しますx+1(++x)--+=+++operator++ランダムアクセス手順を実行する代わりに、繰り返し。operator+=ここでは問題なく機能するはずですが、提示する数値がどれほど小さいかに関係なく、ある時点で常にランダムアクセスの方法を使用したい状況が発生する可能性があると想像できます.


だから...私にとって、私は答えを次のように結論付けます:

すべての後置演算子が前置演算子の前に来る、単純で覚えやすい優先順位リストを持つ利点は、前置演算子と後置演算子/を構成するために常に括弧を使用しなければならないという小さな欠点を許容するのに十分です。めったに使用されません。++--

より単純な「C はこのように行う」というのは、本当の理由のように思われますが、私には満足のいくものではありません。なぜなら、 C ではまったく++x++許可されていなかったので、この構成そのものを再定義することができたからです。既存のコード。

とにかく、(++x)--かっこはそれほど痛くないので、引き続き使用します。

4

3 に答える 3

6

(++x)++2ずつインクリメントxし、「中間」の値を返します。

なぜ(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 に答える